﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml.Linq;
using System.Data.Linq.SqlClient;
using System.Collections;
using DataLayer.dbml;
using System.Data;
using DataLayer.Utilities;

namespace DataLayer.Controller
{    
    /// <summary>
    /// Clase responsable del manejo de los servicios
    /// </summary>
    public class ServicesController : GenericController<SERVICIO, DataClassesDataContext>
    {
        private static string FLUJO_INSTALACION = "FLUJO INSTALACION";
        private static string FLUJO_TRASLADO = "FLUJO TRASLADO";
        private static string FLUJO_CANCELACION = "FLUJO DE CANCELACION";
        private static string ORIGEN_ENLACE_NUEVO = "NUEVO";
        private static string ORIGEN_ENLACE_TRASLADO = "TRASLADO";
        private static string ORIGEN_ENLACE_CANCELACION = "CANCELACION";
        private static string TIPO_SERVICIO_INTERNET = "INTERNET";
        private static string TIPO_SERVICIO_SCPC = "SCPC";
        private static string TIPO_SERVICIO_INTERNACIONAL = "INTERNACIONAL";
        private static string TIPO_SERVICIO_DEMO = "DEMO";
        
        public enum TipoCliente
        {
            CORPORATIVOS = 0,
            FINALES,
            INTERNACIONALES
        }

        public static DataTable GetArbolServicios(string nit, string idCuenta)
        {
            var q = from cta in DataContext.CUENTA
                    join ccf in DataContext.CUENTA_CLIENTEFINAL on cta.ID_CUENTASFDC.Substring(0, 15) equals ccf.ID_CUENTASFDC
                    join cf in DataContext.CLIENTE_FINAL on ccf.ID_CLIENTEFINALSDFC equals cf.ID_CLIENTEFINALSDFC.Substring(0, 15)                                    
                    join pj in DataContext.PROYECTO on ccf.ID_CUENTASDFC_ID_CLIENTEFINALSDFC equals pj.ID_CUENTASDFC_ID_CLIENTEFINALSDFC
                    join svc in DataContext.SERVICIO on pj.ID_PROYECTOSFDC equals svc.ID_PROYECTOSFDC
                    where ccf.ID_CUENTASFDC == idCuenta.Substring(0, 15)
                    && svc.ID_CUENTASFDC == idCuenta && cta.NIT_CUENTA == nit 
                    orderby cf.ID_CLIENTEFINALSDFC, pj.ID_PROYECTOSFDC
                    select new
                    {
                        idClienteFinal = cf.ID_CLIENTEFINALSDFC,
                        clienteFinal = cf.NOMBRE_CLIENTEFINAL,
                        idProyecto = pj.ID_PROYECTOSFDC,
                        proyecto = pj.NOMBRE_PROYECTO,
                        idServicio = svc.ID_SERVICIOSDFC,
                        servicio = svc.NOMBRE_SERVICIO
                    };

            return ConvertData.ToDataTable(q);
        }


        /// <summary>
        /// Retorna todos los servicios asociados un proyecto
        /// </summary>
        /// <param name="idProject">Id del proyecto en Sales Force</param>
        /// <param name="name">Nombre del proyecto, par ahacer una búsqueda tipo LIKE</param>
        /// <returns></returns>
        public static List<SERVICIO> GetAllByProject(string idProject, string name, string idCuenta)
        {
            return (from svc in DataContext.SERVICIO
                    where svc.ID_PROYECTOSFDC == idProject && (name == string.Empty ? true : SqlMethods.Like(svc.NOMBRE_SERVICIO, "%" + name + "%"))
                    && svc.ID_CUENTASFDC == idCuenta
                    select svc).ToList<SERVICIO>();
        }

        #region "Get"
        
        /// <summary>
        /// Retorna los servicios que cumplen con los criterios de búsqueda
        /// </summary>
        /// <param name="id"></param>
        /// <param name="jerarquia"></param>
        /// <param name="busqueda"></param>
        /// <returns></returns>
        public static DataTable GetServiceDetail(string id, PropertiesApp.Jerarquia jerarquia, string busqueda, string idCuenta, TipoCliente tipoCliente)
        {
            if ((tipoCliente == TipoCliente.CORPORATIVOS) || (tipoCliente == TipoCliente.INTERNACIONALES))
                return GetServiceDetailCorporativos(id, jerarquia, busqueda, idCuenta);
            else
                return GetServiceDetailFinales(id, jerarquia, busqueda, idCuenta);            
        }

        #region "GetDetail por tipo de cliente"

        /// <summary>
        /// Retorna los servicios que cumplen con los criterios de búsqueda
        /// </summary>
        /// <param name="id"></param>
        /// <param name="jerarquia"></param>
        /// <param name="busqueda"></param>
        /// <returns></returns>
        public static DataTable GetServiceDetailCorporativos(string id, PropertiesApp.Jerarquia jerarquia, string busqueda, string idCuenta)
        {
            DataTable dt = new DataTable();

            switch (jerarquia)
            {
                case PropertiesApp.Jerarquia.Servicio:
                    var detail = (from svc in DataContext.SERVICIO
                                  join pj in DataContext.PROYECTO on svc.ID_PROYECTOSFDC equals pj.ID_PROYECTOSFDC
                                  join ccf in DataContext.CUENTA_CLIENTEFINAL on pj.ID_CUENTASDFC_ID_CLIENTEFINALSDFC equals ccf.ID_CUENTASDFC_ID_CLIENTEFINALSDFC
                                  join cf in DataContext.CLIENTE_FINAL on ccf.ID_CLIENTEFINALSDFC equals cf.ID_CLIENTEFINALSDFC.Substring(0, 15)
                                  where svc.ID_SERVICIOSDFC == id && ccf.ID_CUENTASFDC == idCuenta.Substring(0, 15)
                                  && (
                                  (busqueda == string.Empty ? true : SqlMethods.Like(cf.NOMBRE_CLIENTEFINAL, "%" + busqueda + "%"))
                                  || (busqueda == string.Empty ? true : SqlMethods.Like(pj.NOMBRE_PROYECTO, "%" + busqueda + "%"))
                                  || (busqueda == string.Empty ? true : SqlMethods.Like(svc.NOMBRE_SERVICIO, "%" + busqueda + "%"))
                                  || (busqueda == string.Empty ? true : SqlMethods.Like(svc.ID_SERVICIO, "%" + busqueda + "%"))
                                  || (busqueda == string.Empty ? true : SqlMethods.Like(svc.NUMERO_CPA, "%" + busqueda + "%"))
                                  || (busqueda == string.Empty ? true : SqlMethods.Like(svc.VELOCIDAD, "%" + busqueda + "%"))
                                  || (busqueda == string.Empty ? true : SqlMethods.Like(svc.TECNOLOGIA, "%" + busqueda + "%"))
                                  || (busqueda == string.Empty ? true : SqlMethods.Like(svc.ESTADO_SERVICIO, "%" + busqueda + "%"))
                                  || (busqueda == string.Empty ? true : SqlMethods.Like(svc.LOCALIZACION, "%" + busqueda + "%"))
                                  )
                                  orderby svc.ESTADO_SERVICIO
                                  select new
                                  {
                                      nombre_cliente = cf.NOMBRE_CLIENTEFINAL,
                                      nombre_proyecto = pj.NOMBRE_PROYECTO,
                                      nombre_servicio = svc.NOMBRE_SERVICIO,
                                      idservicio = svc.ID_SERVICIO,
                                      numero_cpa = svc.NUMERO_CPA,
                                      velocidad = svc.VELOCIDAD,
                                      tecnologia = svc.TECNOLOGIA,
                                      fecha_activacion = svc.FECHA_ACTIVACION,
                                      fecha_activacion2 = "",
                                      estado_servicio = svc.ESTADO_SERVICIO,
                                      localizacion = svc.LOCALIZACION,                                      
                                      divisa = svc.DIVISA,
                                      idServicioSF = svc.ID_SERVICIOSDFC,
                                      fecha_preventa = svc.FECHA_INSTALACION_PREVENTA,
                                      fecha_coordinada = svc.FECHA_PROGRAMADA_INSTALACION
                                  });

                    dt = ConvertData.ToDataTable(detail);
                    break;
                case PropertiesApp.Jerarquia.Proyecto:
                    var detail2 = (from svc in DataContext.SERVICIO
                                   join pj in DataContext.PROYECTO on svc.ID_PROYECTOSFDC equals pj.ID_PROYECTOSFDC
                                   join ccf in DataContext.CUENTA_CLIENTEFINAL on pj.ID_CUENTASDFC_ID_CLIENTEFINALSDFC equals ccf.ID_CUENTASDFC_ID_CLIENTEFINALSDFC
                                   join cf in DataContext.CLIENTE_FINAL on ccf.ID_CLIENTEFINALSDFC equals cf.ID_CLIENTEFINALSDFC.Substring(0, 15)
                                   where pj.ID_PROYECTOSFDC == id && ccf.ID_CUENTASFDC == idCuenta.Substring(0, 15)
                                  && (
                                  (busqueda == string.Empty ? true : SqlMethods.Like(cf.NOMBRE_CLIENTEFINAL, "%" + busqueda + "%"))
                                  || (busqueda == string.Empty ? true : SqlMethods.Like(pj.NOMBRE_PROYECTO, "%" + busqueda + "%"))
                                  || (busqueda == string.Empty ? true : SqlMethods.Like(svc.NOMBRE_SERVICIO, "%" + busqueda + "%"))
                                  || (busqueda == string.Empty ? true : SqlMethods.Like(svc.ID_SERVICIO, "%" + busqueda + "%"))
                                  || (busqueda == string.Empty ? true : SqlMethods.Like(svc.NUMERO_CPA, "%" + busqueda + "%"))
                                  || (busqueda == string.Empty ? true : SqlMethods.Like(svc.VELOCIDAD, "%" + busqueda + "%"))
                                  || (busqueda == string.Empty ? true : SqlMethods.Like(svc.TECNOLOGIA, "%" + busqueda + "%"))
                                  || (busqueda == string.Empty ? true : SqlMethods.Like(svc.ESTADO_SERVICIO, "%" + busqueda + "%"))
                                  || (busqueda == string.Empty ? true : SqlMethods.Like(svc.LOCALIZACION, "%" + busqueda + "%"))
                                  )
                                   orderby svc.ESTADO_SERVICIO
                                   select new
                                   {
                                       nombre_cliente = cf.NOMBRE_CLIENTEFINAL,
                                       nombre_proyecto = pj.NOMBRE_PROYECTO,
                                       nombre_servicio = svc.NOMBRE_SERVICIO,
                                       idservicio = svc.ID_SERVICIO,
                                       numero_cpa = svc.NUMERO_CPA,
                                       velocidad = svc.VELOCIDAD,
                                       tecnologia = svc.TECNOLOGIA,
                                       fecha_activacion = svc.FECHA_ACTIVACION,
                                       fecha_activacion2 = "",
                                       estado_servicio = svc.ESTADO_SERVICIO,
                                       localizacion = svc.LOCALIZACION,                                       
                                       divisa = svc.DIVISA,
                                       idServicioSF = svc.ID_SERVICIOSDFC,
                                       fecha_preventa = svc.FECHA_INSTALACION_PREVENTA,
                                       fecha_coordinada = svc.FECHA_PROGRAMADA_INSTALACION
                                   });

                    dt = ConvertData.ToDataTable(detail2);
                    break;

                case PropertiesApp.Jerarquia.Cliente:
                    var detail3 = (from svc in DataContext.SERVICIO
                                   join pj in DataContext.PROYECTO on svc.ID_PROYECTOSFDC equals pj.ID_PROYECTOSFDC
                                   join ccf in DataContext.CUENTA_CLIENTEFINAL on pj.ID_CUENTASDFC_ID_CLIENTEFINALSDFC equals ccf.ID_CUENTASDFC_ID_CLIENTEFINALSDFC
                                   join cf in DataContext.CLIENTE_FINAL on ccf.ID_CLIENTEFINALSDFC equals cf.ID_CLIENTEFINALSDFC.Substring(0, 15)
                                   where cf.ID_CLIENTEFINALSDFC == id && ccf.ID_CUENTASFDC == idCuenta.Substring(0, 15)
                                   && (
                                   (busqueda == string.Empty ? true : SqlMethods.Like(cf.NOMBRE_CLIENTEFINAL, "%" + busqueda + "%"))
                                   || (busqueda == string.Empty ? true : SqlMethods.Like(pj.NOMBRE_PROYECTO, "%" + busqueda + "%"))
                                   || (busqueda == string.Empty ? true : SqlMethods.Like(svc.NOMBRE_SERVICIO, "%" + busqueda + "%"))
                                   || (busqueda == string.Empty ? true : SqlMethods.Like(svc.ID_SERVICIO, "%" + busqueda + "%"))
                                   || (busqueda == string.Empty ? true : SqlMethods.Like(svc.NUMERO_CPA, "%" + busqueda + "%"))
                                   || (busqueda == string.Empty ? true : SqlMethods.Like(svc.VELOCIDAD, "%" + busqueda + "%"))
                                   || (busqueda == string.Empty ? true : SqlMethods.Like(svc.TECNOLOGIA, "%" + busqueda + "%"))
                                   || (busqueda == string.Empty ? true : SqlMethods.Like(svc.ESTADO_SERVICIO, "%" + busqueda + "%"))
                                   || (busqueda == string.Empty ? true : SqlMethods.Like(svc.LOCALIZACION, "%" + busqueda + "%"))
                                   )
                                   orderby svc.ESTADO_SERVICIO
                                   select new
                                   {
                                       nombre_cliente = cf.NOMBRE_CLIENTEFINAL,
                                       nombre_proyecto = pj.NOMBRE_PROYECTO,
                                       nombre_servicio = svc.NOMBRE_SERVICIO,
                                       idservicio = svc.ID_SERVICIO,
                                       numero_cpa = svc.NUMERO_CPA,
                                       velocidad = svc.VELOCIDAD,
                                       tecnologia = svc.TECNOLOGIA,
                                       fecha_activacion = svc.FECHA_ACTIVACION,
                                       fecha_activacion2 = "",
                                       estado_servicio = svc.ESTADO_SERVICIO,
                                       localizacion = svc.LOCALIZACION,                                       
                                       divisa = svc.DIVISA,
                                       idServicioSF = svc.ID_SERVICIOSDFC,
                                       fecha_preventa = svc.FECHA_INSTALACION_PREVENTA,
                                       fecha_coordinada = svc.FECHA_PROGRAMADA_INSTALACION
                                   });

                    dt = ConvertData.ToDataTable(detail3);
                    break;
                case PropertiesApp.Jerarquia.Todos:
                    var detail4 = (from svc in DataContext.SERVICIO
                                   join pj in DataContext.PROYECTO on svc.ID_PROYECTOSFDC equals pj.ID_PROYECTOSFDC
                                   join ccf in DataContext.CUENTA_CLIENTEFINAL on pj.ID_CUENTASDFC_ID_CLIENTEFINALSDFC equals ccf.ID_CUENTASDFC_ID_CLIENTEFINALSDFC
                                   join cf in DataContext.CLIENTE_FINAL on ccf.ID_CLIENTEFINALSDFC equals cf.ID_CLIENTEFINALSDFC.Substring(0, 15)
                                   where ccf.ID_CUENTASFDC == idCuenta.Substring(0, 15)
                                  && (
                                  (busqueda == string.Empty ? true : SqlMethods.Like(cf.NOMBRE_CLIENTEFINAL, "%" + busqueda + "%"))
                                  || (busqueda == string.Empty ? true : SqlMethods.Like(pj.NOMBRE_PROYECTO, "%" + busqueda + "%"))
                                  || (busqueda == string.Empty ? true : SqlMethods.Like(svc.NOMBRE_SERVICIO, "%" + busqueda + "%"))
                                  || (busqueda == string.Empty ? true : SqlMethods.Like(svc.ID_SERVICIO, "%" + busqueda + "%"))
                                  || (busqueda == string.Empty ? true : SqlMethods.Like(svc.NUMERO_CPA, "%" + busqueda + "%"))
                                  || (busqueda == string.Empty ? true : SqlMethods.Like(svc.VELOCIDAD, "%" + busqueda + "%"))
                                  || (busqueda == string.Empty ? true : SqlMethods.Like(svc.TECNOLOGIA, "%" + busqueda + "%"))
                                  || (busqueda == string.Empty ? true : SqlMethods.Like(svc.ESTADO_SERVICIO, "%" + busqueda + "%"))
                                  || (busqueda == string.Empty ? true : SqlMethods.Like(svc.LOCALIZACION, "%" + busqueda + "%"))
                                  )
                                   orderby svc.ESTADO_SERVICIO
                                   select new
                                   {
                                       nombre_cliente = cf.NOMBRE_CLIENTEFINAL,
                                       nombre_proyecto = pj.NOMBRE_PROYECTO,
                                       nombre_servicio = svc.NOMBRE_SERVICIO,
                                       idservicio = svc.ID_SERVICIO,
                                       numero_cpa = svc.NUMERO_CPA,
                                       velocidad = svc.VELOCIDAD,
                                       tecnologia = svc.TECNOLOGIA,
                                       fecha_activacion = svc.FECHA_ACTIVACION,
                                       fecha_activacion2 = "",
                                       estado_servicio = svc.ESTADO_SERVICIO,
                                       localizacion = svc.LOCALIZACION,                                       
                                       divisa = svc.DIVISA,
                                       idServicioSF = svc.ID_SERVICIOSDFC,
                                       fecha_preventa = svc.FECHA_INSTALACION_PREVENTA,
                                       fecha_coordinada = svc.FECHA_PROGRAMADA_INSTALACION
                                   });

                    dt = ConvertData.ToDataTable(detail4);
                    break;
                default:
                    return dt;
            }

            return dt;
        }

        /// <summary>
        /// Retorna los servicios que cumplen con los criterios de búsqueda
        /// </summary>
        /// <param name="id"></param>
        /// <param name="jerarquia"></param>
        /// <param name="busqueda"></param>
        /// <returns></returns>
        public static DataTable GetServiceDetailFinales(string id, PropertiesApp.Jerarquia jerarquia, string busqueda, string idCuenta)
        {
            DataTable dt = new DataTable();

            var detail = (from svc in DataContext.SERVICIO
                          join ccf in DataContext.CUENTA_CLIENTEFINAL on svc.ID_CUENTASFDC.Substring(0, 15) equals ccf.ID_CUENTASFDC
                          join cta in DataContext.CUENTA on svc.ID_CUENTASFDC equals cta.ID_CUENTASFDC
                          where ccf.ID_CUENTASFDC == idCuenta.Substring(0, 15)
                          && (
                          (busqueda == string.Empty ? true : SqlMethods.Like(cta.NOMBRE_CUENTA, "%" + busqueda + "%"))
                          || (busqueda == string.Empty ? true : SqlMethods.Like(svc.NOMBRE_SERVICIO, "%" + busqueda + "%"))
                          || (busqueda == string.Empty ? true : SqlMethods.Like(svc.ID_SERVICIO, "%" + busqueda + "%"))
                          || (busqueda == string.Empty ? true : SqlMethods.Like(svc.NUMERO_CPA, "%" + busqueda + "%"))
                          || (busqueda == string.Empty ? true : SqlMethods.Like(svc.VELOCIDAD, "%" + busqueda + "%"))
                          || (busqueda == string.Empty ? true : SqlMethods.Like(svc.TECNOLOGIA, "%" + busqueda + "%"))
                          || (busqueda == string.Empty ? true : SqlMethods.Like(svc.ESTADO_SERVICIO, "%" + busqueda + "%"))
                          || (busqueda == string.Empty ? true : SqlMethods.Like(svc.LOCALIZACION, "%" + busqueda + "%"))
                          )
                          orderby svc.ESTADO_SERVICIO
                          select new
                          {
                              nombre_cliente = cta.NOMBRE_CUENTA,
                              nombre_proyecto = "",
                              nombre_servicio = svc.NOMBRE_SERVICIO,
                              idservicio = svc.ID_SERVICIO,
                              numero_cpa = svc.NUMERO_CPA,
                              velocidad = svc.VELOCIDAD,
                              tecnologia = svc.TECNOLOGIA,
                              fecha_activacion = svc.FECHA_ACTIVACION,
                              fecha_activacion2 = "",
                              estado_servicio = svc.ESTADO_SERVICIO,
                              localizacion = svc.LOCALIZACION,                              
                              divisa = svc.DIVISA,
                              idServicioSF = svc.ID_SERVICIOSDFC,
                              fecha_preventa = svc.FECHA_INSTALACION_PREVENTA,
                              fecha_coordinada = svc.FECHA_PROGRAMADA_INSTALACION
                          });

            dt = ConvertData.ToDataTable(detail);
            return dt;
        }


        #endregion

        #region "Actividades en sitio"

        /// <summary>
        /// Retorna información de las instalaciones que cumplen con los criterios de búsqueda
        /// </summary>
        /// <param name="id"></param>
        /// <param name="jerarquia"></param>
        /// <param name="busqueda"></param>
        /// <returns></returns>
        public static DataTable GetInstalationDetail(string id, PropertiesApp.Jerarquia jerarquia, string busqueda, string idCuenta, TipoCliente tipoCliente)
        {
            if ((tipoCliente == TipoCliente.CORPORATIVOS) || (tipoCliente == TipoCliente.INTERNACIONALES))
            {
                if (busqueda.Trim().Length > 0)
                    return GetInstalationDetailCorporativos(id, jerarquia, busqueda, idCuenta);
                else
                    return GetInstalationDetailCorporativos(id, jerarquia, idCuenta);
            }            
            else
                return GetInstalationDetailFinales(id, jerarquia, busqueda, idCuenta);            

        }

        /// <summary>
        /// Retorna información de los traslados que cumplen con los criterios de búsqueda
        /// </summary>
        /// <param name="id"></param>
        /// <param name="jerarquia"></param>
        /// <param name="busqueda"></param>
        /// <returns></returns>
        public static DataTable GetTransferDetail(string id, PropertiesApp.Jerarquia jerarquia, string busqueda, string idCuenta, TipoCliente tipoCliente)
        {
            if ((tipoCliente == TipoCliente.CORPORATIVOS) || (tipoCliente == TipoCliente.INTERNACIONALES))
            {
                if (busqueda.Trim().Length > 0)
                    return GetTransferDetailCorporativos(id, jerarquia, busqueda, idCuenta);
                else
                    return GetTransferDetailCorporativos(id, jerarquia, idCuenta);
            }
                
            else
                return GetTransferDetailFinales(id, jerarquia, busqueda, idCuenta);            

        }

        /// <summary>
        /// Retorna información de los traslados que cumplen con los criterios de búsqueda
        /// </summary>
        /// <param name="id"></param>
        /// <param name="jerarquia"></param>
        /// <param name="busqueda"></param>
        /// <returns></returns>
        public static DataTable GetCancelDetail(string id, PropertiesApp.Jerarquia jerarquia, string busqueda, string idCuenta, TipoCliente tipoCliente)
        {
            if ((tipoCliente == TipoCliente.CORPORATIVOS) || (tipoCliente == TipoCliente.INTERNACIONALES))
            {
                if (busqueda.Trim().Length > 0)
                    return GetCancelDetailCorporativos(id, jerarquia, busqueda, idCuenta);
                else
                    return GetCancelDetailCorporativos(id, jerarquia, idCuenta);
            }
                
            else
                return GetCancelDetailFinales(id, jerarquia, busqueda, idCuenta);            
        }

        /// <summary>
        /// Retorna información de las instalaciones que cumplen con los criterios de búsqueda
        /// </summary>
        /// <param name="id"></param>
        /// <param name="jerarquia"></param>
        /// <param name="busqueda"></param>
        /// <returns></returns>
        public static DataTable GetInstalationDetailCorporativos(string id, PropertiesApp.Jerarquia jerarquia, string busqueda, string idCuenta)
        {
            DataTable dt = new DataTable();
            string[] estados = new string[] { "CONTRATO FIRMADO", "EQUIPOS CONFIGURADOS", "EQUIPOS ENTREGADOS", "EQUIPOS ENTREGADOS PARA CONFIGURAR", "ESTUDIO EN SITIO", "INSTALADO", "PROGRAMADO PARA INSTALACION" };

            switch (jerarquia)
            {
                case PropertiesApp.Jerarquia.Servicio:
                    var detail = (from svc in DataContext.SERVICIO
                                  join pj in DataContext.PROYECTO on svc.ID_PROYECTOSFDC equals pj.ID_PROYECTOSFDC
                                  join ccf in DataContext.CUENTA_CLIENTEFINAL on pj.ID_CUENTASDFC_ID_CLIENTEFINALSDFC equals ccf.ID_CUENTASDFC_ID_CLIENTEFINALSDFC
                                  join cf in DataContext.CLIENTE_FINAL on ccf.ID_CLIENTEFINALSDFC equals cf.ID_CLIENTEFINALSDFC.Substring(0, 15)
                                  where svc.ID_SERVICIOSDFC == id && estados.Contains(svc.ESTADO_SERVICIO)
                                  && svc.TIPO_FLUJO == FLUJO_INSTALACION
                                  && (
                                  (busqueda == string.Empty ? true : SqlMethods.Like(cf.NOMBRE_CLIENTEFINAL, "%" + busqueda + "%"))
                                  || (busqueda == string.Empty ? true : SqlMethods.Like(pj.NOMBRE_PROYECTO, "%" + busqueda + "%"))
                                  || (busqueda == string.Empty ? true : SqlMethods.Like(svc.NOMBRE_SERVICIO, "%" + busqueda + "%"))
                                  || (busqueda == string.Empty ? true : SqlMethods.Like(svc.ID_SERVICIO, "%" + busqueda + "%"))
                                  || (busqueda == string.Empty ? true : SqlMethods.Like(svc.NUMERO_CPA, "%" + busqueda + "%"))
                                  || (busqueda == string.Empty ? true : SqlMethods.Like(svc.VELOCIDAD, "%" + busqueda + "%"))
                                  || (busqueda == string.Empty ? true : SqlMethods.Like(svc.TECNOLOGIA, "%" + busqueda + "%"))
                                  || (busqueda == string.Empty ? true : SqlMethods.Like(svc.ESTADO_SERVICIO, "%" + busqueda + "%"))
                                  || (busqueda == string.Empty ? true : SqlMethods.Like(svc.LOCALIZACION, "%" + busqueda + "%"))
                                  )
                                  select new
                                  {
                                      nombre_cliente = cf.NOMBRE_CLIENTEFINAL,
                                      nombre_proyecto = pj.NOMBRE_PROYECTO,
                                      nombre_servicio = svc.NOMBRE_SERVICIO,
                                      idservicio = svc.ID_SERVICIO,
                                      numero_cpa = svc.NUMERO_CPA,
                                      velocidad = svc.VELOCIDAD,
                                      tecnologia = svc.TECNOLOGIA,
                                      fecha_activacion = svc.FECHA_ACTIVACION,                                      
                                      estado_servicio = svc.ESTADO_SERVICIO,
                                      localizacion = svc.LOCALIZACION,
                                      valor_producto = svc.VALOR_PRODUCTO,
                                      divisa = svc.DIVISA,
                                      idServicioSF = svc.ID_SERVICIOSDFC,
                                      fecha_preventa = svc.FECHA_INSTALACION_PREVENTA,
                                      fecha_preventa2 = "",
                                      fecha_coordinada = svc.FECHA_PROGRAMADA_INSTALACION,
                                      fecha_coordinada2 = ""
                                  });

                    dt = ConvertData.ToDataTable(detail);
                    break;
                case PropertiesApp.Jerarquia.Proyecto:
                    var detail2 = (from svc in DataContext.SERVICIO
                                   join pj in DataContext.PROYECTO on svc.ID_PROYECTOSFDC equals pj.ID_PROYECTOSFDC
                                   join ccf in DataContext.CUENTA_CLIENTEFINAL on pj.ID_CUENTASDFC_ID_CLIENTEFINALSDFC equals ccf.ID_CUENTASDFC_ID_CLIENTEFINALSDFC
                                   join cf in DataContext.CLIENTE_FINAL on ccf.ID_CLIENTEFINALSDFC equals cf.ID_CLIENTEFINALSDFC.Substring(0, 15)
                                   where pj.ID_PROYECTOSFDC == id && estados.Contains(svc.ESTADO_SERVICIO)
                                   && svc.TIPO_FLUJO == FLUJO_INSTALACION
                                   && (
                                   (busqueda == string.Empty ? true : SqlMethods.Like(cf.NOMBRE_CLIENTEFINAL, "%" + busqueda + "%"))
                                   || (busqueda == string.Empty ? true : SqlMethods.Like(pj.NOMBRE_PROYECTO, "%" + busqueda + "%"))
                                   || (busqueda == string.Empty ? true : SqlMethods.Like(svc.NOMBRE_SERVICIO, "%" + busqueda + "%"))
                                   || (busqueda == string.Empty ? true : SqlMethods.Like(svc.ID_SERVICIO, "%" + busqueda + "%"))
                                   || (busqueda == string.Empty ? true : SqlMethods.Like(svc.NUMERO_CPA, "%" + busqueda + "%"))
                                   || (busqueda == string.Empty ? true : SqlMethods.Like(svc.VELOCIDAD, "%" + busqueda + "%"))
                                   || (busqueda == string.Empty ? true : SqlMethods.Like(svc.TECNOLOGIA, "%" + busqueda + "%"))
                                   || (busqueda == string.Empty ? true : SqlMethods.Like(svc.ESTADO_SERVICIO, "%" + busqueda + "%"))
                                   || (busqueda == string.Empty ? true : SqlMethods.Like(svc.LOCALIZACION, "%" + busqueda + "%"))
                                   )
                                   select new
                                   {
                                       nombre_cliente = cf.NOMBRE_CLIENTEFINAL,
                                       nombre_proyecto = pj.NOMBRE_PROYECTO,
                                       nombre_servicio = svc.NOMBRE_SERVICIO,
                                       idservicio = svc.ID_SERVICIO,
                                       numero_cpa = svc.NUMERO_CPA,
                                       velocidad = svc.VELOCIDAD,
                                       tecnologia = svc.TECNOLOGIA,
                                       fecha_activacion = svc.FECHA_ACTIVACION,
                                       estado_servicio = svc.ESTADO_SERVICIO,
                                       localizacion = svc.LOCALIZACION,
                                       valor_producto = svc.VALOR_PRODUCTO,
                                       divisa = svc.DIVISA,
                                       idServicioSF = svc.ID_SERVICIOSDFC,
                                       fecha_preventa = svc.FECHA_INSTALACION_PREVENTA,
                                       fecha_preventa2 = "",
                                       fecha_coordinada = svc.FECHA_PROGRAMADA_INSTALACION,
                                       fecha_coordinada2 = ""
                                   });

                    dt = ConvertData.ToDataTable(detail2);
                    break;

                case PropertiesApp.Jerarquia.Cliente:
                    var detail3 = (from svc in DataContext.SERVICIO
                                   join pj in DataContext.PROYECTO on svc.ID_PROYECTOSFDC equals pj.ID_PROYECTOSFDC
                                   join ccf in DataContext.CUENTA_CLIENTEFINAL on pj.ID_CUENTASDFC_ID_CLIENTEFINALSDFC equals ccf.ID_CUENTASDFC_ID_CLIENTEFINALSDFC
                                   join cf in DataContext.CLIENTE_FINAL on ccf.ID_CLIENTEFINALSDFC equals cf.ID_CLIENTEFINALSDFC.Substring(0, 15)
                                   where cf.ID_CLIENTEFINALSDFC == id && estados.Contains(svc.ESTADO_SERVICIO)
                                   && svc.TIPO_FLUJO == FLUJO_INSTALACION
                                   && (
                                   (busqueda == string.Empty ? true : SqlMethods.Like(cf.NOMBRE_CLIENTEFINAL, "%" + busqueda + "%"))
                                   || (busqueda == string.Empty ? true : SqlMethods.Like(pj.NOMBRE_PROYECTO, "%" + busqueda + "%"))
                                   || (busqueda == string.Empty ? true : SqlMethods.Like(svc.NOMBRE_SERVICIO, "%" + busqueda + "%"))
                                   || (busqueda == string.Empty ? true : SqlMethods.Like(svc.ID_SERVICIO, "%" + busqueda + "%"))
                                   || (busqueda == string.Empty ? true : SqlMethods.Like(svc.NUMERO_CPA, "%" + busqueda + "%"))
                                   || (busqueda == string.Empty ? true : SqlMethods.Like(svc.VELOCIDAD, "%" + busqueda + "%"))
                                   || (busqueda == string.Empty ? true : SqlMethods.Like(svc.TECNOLOGIA, "%" + busqueda + "%"))
                                   || (busqueda == string.Empty ? true : SqlMethods.Like(svc.ESTADO_SERVICIO, "%" + busqueda + "%"))
                                   || (busqueda == string.Empty ? true : SqlMethods.Like(svc.LOCALIZACION, "%" + busqueda + "%"))
                                   )
                                   select new
                                   {
                                       nombre_cliente = cf.NOMBRE_CLIENTEFINAL,
                                       nombre_proyecto = pj.NOMBRE_PROYECTO,
                                       nombre_servicio = svc.NOMBRE_SERVICIO,
                                       idservicio = svc.ID_SERVICIO,
                                       numero_cpa = svc.NUMERO_CPA,
                                       velocidad = svc.VELOCIDAD,
                                       tecnologia = svc.TECNOLOGIA,
                                       fecha_activacion = svc.FECHA_ACTIVACION,
                                       estado_servicio = svc.ESTADO_SERVICIO,
                                       localizacion = svc.LOCALIZACION,
                                       valor_producto = svc.VALOR_PRODUCTO,
                                       divisa = svc.DIVISA,
                                       idServicioSF = svc.ID_SERVICIOSDFC,
                                       fecha_preventa = svc.FECHA_INSTALACION_PREVENTA,
                                       fecha_preventa2 = "",
                                       fecha_coordinada = svc.FECHA_PROGRAMADA_INSTALACION,
                                       fecha_coordinada2 = ""
                                   });

                    dt = ConvertData.ToDataTable(detail3);
                    break;
                case PropertiesApp.Jerarquia.Todos:
                    var detail4 = (from svc in DataContext.SERVICIO
                                   join pj in DataContext.PROYECTO on svc.ID_PROYECTOSFDC equals pj.ID_PROYECTOSFDC
                                   join ccf in DataContext.CUENTA_CLIENTEFINAL on pj.ID_CUENTASDFC_ID_CLIENTEFINALSDFC equals ccf.ID_CUENTASDFC_ID_CLIENTEFINALSDFC
                                   join cf in DataContext.CLIENTE_FINAL on ccf.ID_CLIENTEFINALSDFC equals cf.ID_CLIENTEFINALSDFC.Substring(0, 15)
                                   where ccf.ID_CUENTASFDC == idCuenta.Substring(0, 15) && estados.Contains(svc.ESTADO_SERVICIO)
                                   && svc.TIPO_FLUJO == FLUJO_INSTALACION
                                   && (
                                   (busqueda == string.Empty ? true : SqlMethods.Like(cf.NOMBRE_CLIENTEFINAL, "%" + busqueda + "%"))
                                   || (busqueda == string.Empty ? true : SqlMethods.Like(pj.NOMBRE_PROYECTO, "%" + busqueda + "%"))
                                   || (busqueda == string.Empty ? true : SqlMethods.Like(svc.NOMBRE_SERVICIO, "%" + busqueda + "%"))
                                   || (busqueda == string.Empty ? true : SqlMethods.Like(svc.ID_SERVICIO, "%" + busqueda + "%"))
                                   || (busqueda == string.Empty ? true : SqlMethods.Like(svc.NUMERO_CPA, "%" + busqueda + "%"))
                                   || (busqueda == string.Empty ? true : SqlMethods.Like(svc.VELOCIDAD, "%" + busqueda + "%"))
                                   || (busqueda == string.Empty ? true : SqlMethods.Like(svc.TECNOLOGIA, "%" + busqueda + "%"))
                                   || (busqueda == string.Empty ? true : SqlMethods.Like(svc.ESTADO_SERVICIO, "%" + busqueda + "%"))
                                   || (busqueda == string.Empty ? true : SqlMethods.Like(svc.LOCALIZACION, "%" + busqueda + "%"))
                                   )
                                   select new
                                   {
                                       nombre_cliente = cf.NOMBRE_CLIENTEFINAL,
                                       nombre_proyecto = pj.NOMBRE_PROYECTO,
                                       nombre_servicio = svc.NOMBRE_SERVICIO,
                                       idservicio = svc.ID_SERVICIO,
                                       numero_cpa = svc.NUMERO_CPA,
                                       velocidad = svc.VELOCIDAD,
                                       tecnologia = svc.TECNOLOGIA,
                                       fecha_activacion = svc.FECHA_ACTIVACION,
                                       estado_servicio = svc.ESTADO_SERVICIO,
                                       localizacion = svc.LOCALIZACION,
                                       valor_producto = svc.VALOR_PRODUCTO,
                                       divisa = svc.DIVISA,
                                       idServicioSF = svc.ID_SERVICIOSDFC,
                                       fecha_preventa = svc.FECHA_INSTALACION_PREVENTA,
                                       fecha_preventa2 = "",
                                       fecha_coordinada = svc.FECHA_PROGRAMADA_INSTALACION,
                                       fecha_coordinada2 = ""
                                   });

                    dt = ConvertData.ToDataTable(detail4);
                    break;

                default:
                    return dt;
            }

            return dt;
        }

        /// <summary>
        /// Retorna información de las instalaciones que cumplen con los criterios de búsqueda
        /// </summary>
        /// <param name="id"></param>
        /// <param name="jerarquia"></param>
        /// <returns></returns>
        public static DataTable GetInstalationDetailCorporativos(string id, PropertiesApp.Jerarquia jerarquia, string idCuenta)
        {
            DataTable dt = new DataTable();
            string[] estados = new string[] { "CONTRATO FIRMADO", "EQUIPOS CONFIGURADOS", "EQUIPOS ENTREGADOS", "EQUIPOS ENTREGADOS PARA CONFIGURAR", "ESTUDIO EN SITIO", "INSTALADO", "PROGRAMADO PARA INSTALACION" };

            switch (jerarquia)
            {
                case PropertiesApp.Jerarquia.Servicio:
                    var detail = (from svc in DataContext.SERVICIO
                                  join pj in DataContext.PROYECTO on svc.ID_PROYECTOSFDC equals pj.ID_PROYECTOSFDC
                                  join ccf in DataContext.CUENTA_CLIENTEFINAL on pj.ID_CUENTASDFC_ID_CLIENTEFINALSDFC equals ccf.ID_CUENTASDFC_ID_CLIENTEFINALSDFC
                                  join cf in DataContext.CLIENTE_FINAL on ccf.ID_CLIENTEFINALSDFC equals cf.ID_CLIENTEFINALSDFC.Substring(0, 15)
                                  where svc.ID_SERVICIOSDFC == id && estados.Contains(svc.ESTADO_SERVICIO)
                                  && svc.TIPO_FLUJO == FLUJO_INSTALACION
                                  select new
                                  {
                                      nombre_cliente = cf.NOMBRE_CLIENTEFINAL,
                                      nombre_proyecto = pj.NOMBRE_PROYECTO,
                                      nombre_servicio = svc.NOMBRE_SERVICIO,
                                      idservicio = svc.ID_SERVICIO,
                                      numero_cpa = svc.NUMERO_CPA,
                                      velocidad = svc.VELOCIDAD,
                                      tecnologia = svc.TECNOLOGIA,
                                      fecha_activacion = svc.FECHA_ACTIVACION,
                                      estado_servicio = svc.ESTADO_SERVICIO,
                                      localizacion = svc.LOCALIZACION,
                                      valor_producto = svc.VALOR_PRODUCTO,
                                      divisa = svc.DIVISA,
                                      idServicioSF = svc.ID_SERVICIOSDFC,
                                      fecha_preventa = svc.FECHA_INSTALACION_PREVENTA,
                                      fecha_preventa2 = "",
                                      fecha_coordinada = svc.FECHA_PROGRAMADA_INSTALACION,
                                      fecha_coordinada2 = ""
                                  });

                    dt = ConvertData.ToDataTable(detail);
                    break;
                case PropertiesApp.Jerarquia.Proyecto:
                    var detail2 = (from svc in DataContext.SERVICIO
                                   join pj in DataContext.PROYECTO on svc.ID_PROYECTOSFDC equals pj.ID_PROYECTOSFDC
                                   join ccf in DataContext.CUENTA_CLIENTEFINAL on pj.ID_CUENTASDFC_ID_CLIENTEFINALSDFC equals ccf.ID_CUENTASDFC_ID_CLIENTEFINALSDFC
                                   join cf in DataContext.CLIENTE_FINAL on ccf.ID_CLIENTEFINALSDFC equals cf.ID_CLIENTEFINALSDFC.Substring(0, 15)
                                   where pj.ID_PROYECTOSFDC == id && estados.Contains(svc.ESTADO_SERVICIO)
                                   && svc.TIPO_FLUJO == FLUJO_INSTALACION
                                   select new
                                   {
                                       nombre_cliente = cf.NOMBRE_CLIENTEFINAL,
                                       nombre_proyecto = pj.NOMBRE_PROYECTO,
                                       nombre_servicio = svc.NOMBRE_SERVICIO,
                                       idservicio = svc.ID_SERVICIO,
                                       numero_cpa = svc.NUMERO_CPA,
                                       velocidad = svc.VELOCIDAD,
                                       tecnologia = svc.TECNOLOGIA,
                                       fecha_activacion = svc.FECHA_ACTIVACION,
                                       estado_servicio = svc.ESTADO_SERVICIO,
                                       localizacion = svc.LOCALIZACION,
                                       valor_producto = svc.VALOR_PRODUCTO,
                                       divisa = svc.DIVISA,
                                       idServicioSF = svc.ID_SERVICIOSDFC,
                                       fecha_preventa = svc.FECHA_INSTALACION_PREVENTA,
                                       fecha_preventa2 = "",
                                       fecha_coordinada = svc.FECHA_PROGRAMADA_INSTALACION,
                                       fecha_coordinada2 = ""
                                   });

                    dt = ConvertData.ToDataTable(detail2);
                    break;

                case PropertiesApp.Jerarquia.Cliente:
                    var detail3 = (from svc in DataContext.SERVICIO
                                   join pj in DataContext.PROYECTO on svc.ID_PROYECTOSFDC equals pj.ID_PROYECTOSFDC
                                   join ccf in DataContext.CUENTA_CLIENTEFINAL on pj.ID_CUENTASDFC_ID_CLIENTEFINALSDFC equals ccf.ID_CUENTASDFC_ID_CLIENTEFINALSDFC
                                   join cf in DataContext.CLIENTE_FINAL on ccf.ID_CLIENTEFINALSDFC equals cf.ID_CLIENTEFINALSDFC.Substring(0, 15)
                                   where cf.ID_CLIENTEFINALSDFC == id && estados.Contains(svc.ESTADO_SERVICIO)
                                   && svc.TIPO_FLUJO == FLUJO_INSTALACION
                                   select new
                                   {
                                       nombre_cliente = cf.NOMBRE_CLIENTEFINAL,
                                       nombre_proyecto = pj.NOMBRE_PROYECTO,
                                       nombre_servicio = svc.NOMBRE_SERVICIO,
                                       idservicio = svc.ID_SERVICIO,
                                       numero_cpa = svc.NUMERO_CPA,
                                       velocidad = svc.VELOCIDAD,
                                       tecnologia = svc.TECNOLOGIA,
                                       fecha_activacion = svc.FECHA_ACTIVACION,
                                       estado_servicio = svc.ESTADO_SERVICIO,
                                       localizacion = svc.LOCALIZACION,
                                       valor_producto = svc.VALOR_PRODUCTO,
                                       divisa = svc.DIVISA,
                                       idServicioSF = svc.ID_SERVICIOSDFC,
                                       fecha_preventa = svc.FECHA_INSTALACION_PREVENTA,
                                       fecha_preventa2 = "",
                                       fecha_coordinada = svc.FECHA_PROGRAMADA_INSTALACION,
                                       fecha_coordinada2 = ""
                                   });

                    dt = ConvertData.ToDataTable(detail3);
                    break;
                case PropertiesApp.Jerarquia.Todos:
                    var detail4 = (from svc in DataContext.SERVICIO
                                   join pj in DataContext.PROYECTO on svc.ID_PROYECTOSFDC equals pj.ID_PROYECTOSFDC
                                   join ccf in DataContext.CUENTA_CLIENTEFINAL on pj.ID_CUENTASDFC_ID_CLIENTEFINALSDFC equals ccf.ID_CUENTASDFC_ID_CLIENTEFINALSDFC
                                   join cf in DataContext.CLIENTE_FINAL on ccf.ID_CLIENTEFINALSDFC equals cf.ID_CLIENTEFINALSDFC.Substring(0, 15)
                                   where ccf.ID_CUENTASFDC == idCuenta.Substring(0, 15) && estados.Contains(svc.ESTADO_SERVICIO)
                                   && svc.TIPO_FLUJO == FLUJO_INSTALACION
                                   select new
                                   {
                                       nombre_cliente = cf.NOMBRE_CLIENTEFINAL,
                                       nombre_proyecto = pj.NOMBRE_PROYECTO,
                                       nombre_servicio = svc.NOMBRE_SERVICIO,
                                       idservicio = svc.ID_SERVICIO,
                                       numero_cpa = svc.NUMERO_CPA,
                                       velocidad = svc.VELOCIDAD,
                                       tecnologia = svc.TECNOLOGIA,
                                       fecha_activacion = svc.FECHA_ACTIVACION,
                                       estado_servicio = svc.ESTADO_SERVICIO,
                                       localizacion = svc.LOCALIZACION,
                                       valor_producto = svc.VALOR_PRODUCTO,
                                       divisa = svc.DIVISA,
                                       idServicioSF = svc.ID_SERVICIOSDFC,
                                       fecha_preventa = svc.FECHA_INSTALACION_PREVENTA,
                                       fecha_preventa2 = "",
                                       fecha_coordinada = svc.FECHA_PROGRAMADA_INSTALACION,
                                       fecha_coordinada2 = ""
                                   });

                    dt = ConvertData.ToDataTable(detail4);
                    break;

                default:
                    return dt;
            }

            return dt;
        }


        /// <summary>
        /// Retorna información de las instalaciones que cumplen con los criterios de búsqueda
        /// </summary>
        /// <param name="id"></param>
        /// <param name="jerarquia"></param>
        /// <param name="busqueda"></param>
        /// <returns></returns>
        public static DataTable GetInstalationDetailFinales(string id, PropertiesApp.Jerarquia jerarquia, string busqueda, string idCuenta)
        {
            DataTable dt = new DataTable();
            string[] estados = new string[] { "CONTRATO FIRMADO", "EQUIPOS CONFIGURADOS", "EQUIPOS ENTREGADOS", "EQUIPOS ENTREGADOS PARA CONFIGURAR", "ESTUDIO EN SITIO", "INSTALADO", "PROGRAMADO PARA INSTALACION" };

            var detail = (from svc in DataContext.SERVICIO
                          join ccf in DataContext.CUENTA_CLIENTEFINAL on svc.ID_CUENTASFDC.Substring(0, 15) equals ccf.ID_CUENTASFDC
                          join cta in DataContext.CUENTA on svc.ID_CUENTASFDC equals cta.ID_CUENTASFDC
                          where ccf.ID_CUENTASFDC == idCuenta.Substring(0, 15) && estados.Contains(svc.ESTADO_SERVICIO)
                          && svc.TIPO_FLUJO == FLUJO_INSTALACION
                          && (
                          (busqueda == string.Empty ? true : SqlMethods.Like(cta.NOMBRE_CUENTA, "%" + busqueda + "%"))                          
                          || (busqueda == string.Empty ? true : SqlMethods.Like(svc.NOMBRE_SERVICIO, "%" + busqueda + "%"))
                          || (busqueda == string.Empty ? true : SqlMethods.Like(svc.ID_SERVICIO, "%" + busqueda + "%"))
                          || (busqueda == string.Empty ? true : SqlMethods.Like(svc.NUMERO_CPA, "%" + busqueda + "%"))
                          || (busqueda == string.Empty ? true : SqlMethods.Like(svc.VELOCIDAD, "%" + busqueda + "%"))
                          || (busqueda == string.Empty ? true : SqlMethods.Like(svc.TECNOLOGIA, "%" + busqueda + "%"))
                          || (busqueda == string.Empty ? true : SqlMethods.Like(svc.ESTADO_SERVICIO, "%" + busqueda + "%"))
                          || (busqueda == string.Empty ? true : SqlMethods.Like(svc.LOCALIZACION, "%" + busqueda + "%"))
                          )
                          select new
                          {
                              nombre_cliente = cta.NOMBRE_CUENTA,
                              nombre_proyecto = "",
                              nombre_servicio = svc.NOMBRE_SERVICIO,
                              idservicio = svc.ID_SERVICIO,
                              numero_cpa = svc.NUMERO_CPA,
                              velocidad = svc.VELOCIDAD,
                              tecnologia = svc.TECNOLOGIA,
                              fecha_activacion = svc.FECHA_ACTIVACION,
                              estado_servicio = svc.ESTADO_SERVICIO,
                              localizacion = svc.LOCALIZACION,
                              valor_producto = svc.VALOR_PRODUCTO,
                              divisa = svc.DIVISA,
                              idServicioSF = svc.ID_SERVICIOSDFC,
                              fecha_preventa = svc.FECHA_INSTALACION_PREVENTA,
                              fecha_preventa2 = "",
                              fecha_coordinada = svc.FECHA_PROGRAMADA_INSTALACION,
                              fecha_coordinada2 = ""
                          });

            dt = ConvertData.ToDataTable(detail);

            return dt;
        }

        /// <summary>
        /// Retorna información de los traslados que cumplen con los criterios de búsqueda
        /// </summary>
        /// <param name="id"></param>
        /// <param name="jerarquia"></param>
        /// <param name="busqueda"></param>
        /// <returns></returns>
        public static DataTable GetTransferDetailCorporativos(string id, PropertiesApp.Jerarquia jerarquia, string busqueda, string idCuenta)
        {
            DataTable dt = new DataTable();
            string[] estados = new string[] { "CONTRATO FIRMADO", "EQUIPOS CONFIGURADOS", "EQUIPOS ENTREGADOS", "EQUIPOS ENTREGADOS PARA CONFIGURAR", "ESTUDIO EN SITIO", "INSTALADO", "PROGRAMADO PARA INSTALACION" };

            switch (jerarquia)
            {
                case PropertiesApp.Jerarquia.Servicio:
                    var detail = (from svc in DataContext.SERVICIO
                                  join pj in DataContext.PROYECTO on svc.ID_PROYECTOSFDC equals pj.ID_PROYECTOSFDC
                                  join ccf in DataContext.CUENTA_CLIENTEFINAL on pj.ID_CUENTASDFC_ID_CLIENTEFINALSDFC equals ccf.ID_CUENTASDFC_ID_CLIENTEFINALSDFC
                                  join cf in DataContext.CLIENTE_FINAL on ccf.ID_CLIENTEFINALSDFC equals cf.ID_CLIENTEFINALSDFC.Substring(0, 15)
                                  where svc.ID_SERVICIOSDFC == id && estados.Contains(svc.ESTADO_SERVICIO)
                                  && svc.TIPO_FLUJO == FLUJO_TRASLADO
                                  && (
                                  (busqueda == string.Empty ? true : SqlMethods.Like(cf.NOMBRE_CLIENTEFINAL, "%" + busqueda + "%"))
                                  || (busqueda == string.Empty ? true : SqlMethods.Like(pj.NOMBRE_PROYECTO, "%" + busqueda + "%"))
                                  || (busqueda == string.Empty ? true : SqlMethods.Like(svc.NOMBRE_SERVICIO, "%" + busqueda + "%"))
                                  || (busqueda == string.Empty ? true : SqlMethods.Like(svc.ID_SERVICIO, "%" + busqueda + "%"))
                                  || (busqueda == string.Empty ? true : SqlMethods.Like(svc.NUMERO_CPA, "%" + busqueda + "%"))
                                  || (busqueda == string.Empty ? true : SqlMethods.Like(svc.VELOCIDAD, "%" + busqueda + "%"))
                                  || (busqueda == string.Empty ? true : SqlMethods.Like(svc.TECNOLOGIA, "%" + busqueda + "%"))
                                  || (busqueda == string.Empty ? true : SqlMethods.Like(svc.ESTADO_SERVICIO, "%" + busqueda + "%"))
                                  || (busqueda == string.Empty ? true : SqlMethods.Like(svc.LOCALIZACION, "%" + busqueda + "%"))
                                  )
                                  select new
                                  {
                                      nombre_cliente = cf.NOMBRE_CLIENTEFINAL,
                                      nombre_proyecto = pj.NOMBRE_PROYECTO,
                                      nombre_servicio = svc.NOMBRE_SERVICIO,
                                      idservicio = svc.ID_SERVICIO,
                                      numero_cpa = svc.NUMERO_CPA,
                                      velocidad = svc.VELOCIDAD,
                                      tecnologia = svc.TECNOLOGIA,
                                      fecha_activacion = svc.FECHA_ACTIVACION,
                                      estado_servicio = svc.ESTADO_SERVICIO,
                                      localizacion = svc.LOCALIZACION,
                                      valor_producto = svc.VALOR_PRODUCTO,
                                      divisa = svc.DIVISA,
                                      idServicioSF = svc.ID_SERVICIOSDFC,
                                      fecha_preventa = svc.FECHA_INSTALACION_PREVENTA,
                                      fecha_preventa2 = "",
                                      fecha_coordinada = svc.FECHA_PROGRAMADA_INSTALACION,
                                      fecha_coordinada2 = ""
                                  });

                    dt = ConvertData.ToDataTable(detail);
                    break;
                case PropertiesApp.Jerarquia.Proyecto:
                    var detail2 = (from svc in DataContext.SERVICIO
                                   join pj in DataContext.PROYECTO on svc.ID_PROYECTOSFDC equals pj.ID_PROYECTOSFDC
                                   join ccf in DataContext.CUENTA_CLIENTEFINAL on pj.ID_CUENTASDFC_ID_CLIENTEFINALSDFC equals ccf.ID_CUENTASDFC_ID_CLIENTEFINALSDFC
                                   join cf in DataContext.CLIENTE_FINAL on ccf.ID_CLIENTEFINALSDFC equals cf.ID_CLIENTEFINALSDFC.Substring(0, 15)
                                   where pj.ID_PROYECTOSFDC == id && estados.Contains(svc.ESTADO_SERVICIO)
                                   && svc.TIPO_FLUJO == FLUJO_TRASLADO
                                   && (
                                   (busqueda == string.Empty ? true : SqlMethods.Like(cf.NOMBRE_CLIENTEFINAL, "%" + busqueda + "%"))
                                   || (busqueda == string.Empty ? true : SqlMethods.Like(pj.NOMBRE_PROYECTO, "%" + busqueda + "%"))
                                   || (busqueda == string.Empty ? true : SqlMethods.Like(svc.NOMBRE_SERVICIO, "%" + busqueda + "%"))
                                   || (busqueda == string.Empty ? true : SqlMethods.Like(svc.ID_SERVICIO, "%" + busqueda + "%"))
                                   || (busqueda == string.Empty ? true : SqlMethods.Like(svc.NUMERO_CPA, "%" + busqueda + "%"))
                                   || (busqueda == string.Empty ? true : SqlMethods.Like(svc.VELOCIDAD, "%" + busqueda + "%"))
                                   || (busqueda == string.Empty ? true : SqlMethods.Like(svc.TECNOLOGIA, "%" + busqueda + "%"))
                                   || (busqueda == string.Empty ? true : SqlMethods.Like(svc.ESTADO_SERVICIO, "%" + busqueda + "%"))
                                   || (busqueda == string.Empty ? true : SqlMethods.Like(svc.LOCALIZACION, "%" + busqueda + "%"))
                                   )
                                   select new
                                   {
                                       nombre_cliente = cf.NOMBRE_CLIENTEFINAL,
                                       nombre_proyecto = pj.NOMBRE_PROYECTO,
                                       nombre_servicio = svc.NOMBRE_SERVICIO,
                                       idservicio = svc.ID_SERVICIO,
                                       numero_cpa = svc.NUMERO_CPA,
                                       velocidad = svc.VELOCIDAD,
                                       tecnologia = svc.TECNOLOGIA,
                                       fecha_activacion = svc.FECHA_ACTIVACION,
                                       estado_servicio = svc.ESTADO_SERVICIO,
                                       localizacion = svc.LOCALIZACION,
                                       valor_producto = svc.VALOR_PRODUCTO,
                                       divisa = svc.DIVISA,
                                       idServicioSF = svc.ID_SERVICIOSDFC,
                                       fecha_preventa = svc.FECHA_INSTALACION_PREVENTA,
                                       fecha_preventa2 = "",
                                       fecha_coordinada = svc.FECHA_PROGRAMADA_INSTALACION,
                                       fecha_coordinada2 = ""
                                   });

                    dt = ConvertData.ToDataTable(detail2);
                    break;

                case PropertiesApp.Jerarquia.Cliente:
                    var detail3 = (from svc in DataContext.SERVICIO
                                   join pj in DataContext.PROYECTO on svc.ID_PROYECTOSFDC equals pj.ID_PROYECTOSFDC
                                   join ccf in DataContext.CUENTA_CLIENTEFINAL on pj.ID_CUENTASDFC_ID_CLIENTEFINALSDFC equals ccf.ID_CUENTASDFC_ID_CLIENTEFINALSDFC
                                   join cf in DataContext.CLIENTE_FINAL on ccf.ID_CLIENTEFINALSDFC equals cf.ID_CLIENTEFINALSDFC.Substring(0, 15)
                                   where cf.ID_CLIENTEFINALSDFC == id && estados.Contains(svc.ESTADO_SERVICIO)
                                   && svc.TIPO_FLUJO == FLUJO_TRASLADO
                                   && (
                                   (busqueda == string.Empty ? true : SqlMethods.Like(cf.NOMBRE_CLIENTEFINAL, "%" + busqueda + "%"))
                                   || (busqueda == string.Empty ? true : SqlMethods.Like(pj.NOMBRE_PROYECTO, "%" + busqueda + "%"))
                                   || (busqueda == string.Empty ? true : SqlMethods.Like(svc.NOMBRE_SERVICIO, "%" + busqueda + "%"))
                                   || (busqueda == string.Empty ? true : SqlMethods.Like(svc.ID_SERVICIO, "%" + busqueda + "%"))
                                   || (busqueda == string.Empty ? true : SqlMethods.Like(svc.NUMERO_CPA, "%" + busqueda + "%"))
                                   || (busqueda == string.Empty ? true : SqlMethods.Like(svc.VELOCIDAD, "%" + busqueda + "%"))
                                   || (busqueda == string.Empty ? true : SqlMethods.Like(svc.TECNOLOGIA, "%" + busqueda + "%"))
                                   || (busqueda == string.Empty ? true : SqlMethods.Like(svc.ESTADO_SERVICIO, "%" + busqueda + "%"))
                                   || (busqueda == string.Empty ? true : SqlMethods.Like(svc.LOCALIZACION, "%" + busqueda + "%"))
                                   )
                                   select new
                                   {
                                       nombre_cliente = cf.NOMBRE_CLIENTEFINAL,
                                       nombre_proyecto = pj.NOMBRE_PROYECTO,
                                       nombre_servicio = svc.NOMBRE_SERVICIO,
                                       idservicio = svc.ID_SERVICIO,
                                       numero_cpa = svc.NUMERO_CPA,
                                       velocidad = svc.VELOCIDAD,
                                       tecnologia = svc.TECNOLOGIA,
                                       fecha_activacion = svc.FECHA_ACTIVACION,
                                       estado_servicio = svc.ESTADO_SERVICIO,
                                       localizacion = svc.LOCALIZACION,
                                       valor_producto = svc.VALOR_PRODUCTO,
                                       divisa = svc.DIVISA,
                                       idServicioSF = svc.ID_SERVICIOSDFC,
                                       fecha_preventa = svc.FECHA_INSTALACION_PREVENTA,
                                       fecha_preventa2 = "",
                                       fecha_coordinada = svc.FECHA_PROGRAMADA_INSTALACION,
                                       fecha_coordinada2 = ""
                                   });

                    dt = ConvertData.ToDataTable(detail3);
                    break;
                case PropertiesApp.Jerarquia.Todos:
                    var detail4 = (from svc in DataContext.SERVICIO
                                   join pj in DataContext.PROYECTO on svc.ID_PROYECTOSFDC equals pj.ID_PROYECTOSFDC
                                   join ccf in DataContext.CUENTA_CLIENTEFINAL on pj.ID_CUENTASDFC_ID_CLIENTEFINALSDFC equals ccf.ID_CUENTASDFC_ID_CLIENTEFINALSDFC
                                   join cf in DataContext.CLIENTE_FINAL on ccf.ID_CLIENTEFINALSDFC equals cf.ID_CLIENTEFINALSDFC.Substring(0, 15)
                                   where ccf.ID_CUENTASFDC == idCuenta.Substring(0, 15) && estados.Contains(svc.ESTADO_SERVICIO)
                                   && svc.TIPO_FLUJO == FLUJO_TRASLADO
                                   && (
                                   (busqueda == string.Empty ? true : SqlMethods.Like(cf.NOMBRE_CLIENTEFINAL, "%" + busqueda + "%"))
                                   || (busqueda == string.Empty ? true : SqlMethods.Like(pj.NOMBRE_PROYECTO, "%" + busqueda + "%"))
                                   || (busqueda == string.Empty ? true : SqlMethods.Like(svc.NOMBRE_SERVICIO, "%" + busqueda + "%"))
                                   || (busqueda == string.Empty ? true : SqlMethods.Like(svc.ID_SERVICIO, "%" + busqueda + "%"))
                                   || (busqueda == string.Empty ? true : SqlMethods.Like(svc.NUMERO_CPA, "%" + busqueda + "%"))
                                   || (busqueda == string.Empty ? true : SqlMethods.Like(svc.VELOCIDAD, "%" + busqueda + "%"))
                                   || (busqueda == string.Empty ? true : SqlMethods.Like(svc.TECNOLOGIA, "%" + busqueda + "%"))
                                   || (busqueda == string.Empty ? true : SqlMethods.Like(svc.ESTADO_SERVICIO, "%" + busqueda + "%"))
                                   || (busqueda == string.Empty ? true : SqlMethods.Like(svc.LOCALIZACION, "%" + busqueda + "%"))
                                   )
                                   select new
                                   {
                                       nombre_cliente = cf.NOMBRE_CLIENTEFINAL,
                                       nombre_proyecto = pj.NOMBRE_PROYECTO,
                                       nombre_servicio = svc.NOMBRE_SERVICIO,
                                       idservicio = svc.ID_SERVICIO,
                                       numero_cpa = svc.NUMERO_CPA,
                                       velocidad = svc.VELOCIDAD,
                                       tecnologia = svc.TECNOLOGIA,
                                       fecha_activacion = svc.FECHA_ACTIVACION,
                                       estado_servicio = svc.ESTADO_SERVICIO,
                                       localizacion = svc.LOCALIZACION,
                                       valor_producto = svc.VALOR_PRODUCTO,
                                       divisa = svc.DIVISA,
                                       idServicioSF = svc.ID_SERVICIOSDFC,
                                       fecha_preventa = svc.FECHA_INSTALACION_PREVENTA,
                                       fecha_preventa2 = "",
                                       fecha_coordinada = svc.FECHA_PROGRAMADA_INSTALACION,
                                       fecha_coordinada2 = ""
                                   });

                    dt = ConvertData.ToDataTable(detail4);
                    break;
                default:
                    return dt;
            }

            return dt;
        }


        /// <summary>
        /// Retorna información de los traslados que cumplen con los criterios de búsqueda
        /// </summary>
        /// <param name="id"></param>
        /// <param name="jerarquia"></param>
        /// <returns></returns>
        public static DataTable GetTransferDetailCorporativos(string id, PropertiesApp.Jerarquia jerarquia, string idCuenta)
        {
            DataTable dt = new DataTable();
            string[] estados = new string[] { "CONTRATO FIRMADO", "EQUIPOS CONFIGURADOS", "EQUIPOS ENTREGADOS", "EQUIPOS ENTREGADOS PARA CONFIGURAR", "ESTUDIO EN SITIO", "INSTALADO", "PROGRAMADO PARA INSTALACION" };

            switch (jerarquia)
            {
                case PropertiesApp.Jerarquia.Servicio:
                    var detail = (from svc in DataContext.SERVICIO
                                  join pj in DataContext.PROYECTO on svc.ID_PROYECTOSFDC equals pj.ID_PROYECTOSFDC
                                  join ccf in DataContext.CUENTA_CLIENTEFINAL on pj.ID_CUENTASDFC_ID_CLIENTEFINALSDFC equals ccf.ID_CUENTASDFC_ID_CLIENTEFINALSDFC
                                  join cf in DataContext.CLIENTE_FINAL on ccf.ID_CLIENTEFINALSDFC equals cf.ID_CLIENTEFINALSDFC.Substring(0, 15)
                                  where svc.ID_SERVICIOSDFC == id && estados.Contains(svc.ESTADO_SERVICIO)
                                  && svc.TIPO_FLUJO == FLUJO_TRASLADO
                                  select new
                                  {
                                      nombre_cliente = cf.NOMBRE_CLIENTEFINAL,
                                      nombre_proyecto = pj.NOMBRE_PROYECTO,
                                      nombre_servicio = svc.NOMBRE_SERVICIO,
                                      idservicio = svc.ID_SERVICIO,
                                      numero_cpa = svc.NUMERO_CPA,
                                      velocidad = svc.VELOCIDAD,
                                      tecnologia = svc.TECNOLOGIA,
                                      fecha_activacion = svc.FECHA_ACTIVACION,
                                      estado_servicio = svc.ESTADO_SERVICIO,
                                      localizacion = svc.LOCALIZACION,
                                      valor_producto = svc.VALOR_PRODUCTO,
                                      divisa = svc.DIVISA,
                                      idServicioSF = svc.ID_SERVICIOSDFC,
                                      fecha_preventa = svc.FECHA_INSTALACION_PREVENTA,
                                      fecha_preventa2 = "",
                                      fecha_coordinada = svc.FECHA_PROGRAMADA_INSTALACION,
                                      fecha_coordinada2 = ""
                                  });

                    dt = ConvertData.ToDataTable(detail);
                    break;
                case PropertiesApp.Jerarquia.Proyecto:
                    var detail2 = (from svc in DataContext.SERVICIO
                                   join pj in DataContext.PROYECTO on svc.ID_PROYECTOSFDC equals pj.ID_PROYECTOSFDC
                                   join ccf in DataContext.CUENTA_CLIENTEFINAL on pj.ID_CUENTASDFC_ID_CLIENTEFINALSDFC equals ccf.ID_CUENTASDFC_ID_CLIENTEFINALSDFC
                                   join cf in DataContext.CLIENTE_FINAL on ccf.ID_CLIENTEFINALSDFC equals cf.ID_CLIENTEFINALSDFC.Substring(0, 15)
                                   where pj.ID_PROYECTOSFDC == id && estados.Contains(svc.ESTADO_SERVICIO)
                                   && svc.TIPO_FLUJO == FLUJO_TRASLADO
                                   select new
                                   {
                                       nombre_cliente = cf.NOMBRE_CLIENTEFINAL,
                                       nombre_proyecto = pj.NOMBRE_PROYECTO,
                                       nombre_servicio = svc.NOMBRE_SERVICIO,
                                       idservicio = svc.ID_SERVICIO,
                                       numero_cpa = svc.NUMERO_CPA,
                                       velocidad = svc.VELOCIDAD,
                                       tecnologia = svc.TECNOLOGIA,
                                       fecha_activacion = svc.FECHA_ACTIVACION,
                                       estado_servicio = svc.ESTADO_SERVICIO,
                                       localizacion = svc.LOCALIZACION,
                                       valor_producto = svc.VALOR_PRODUCTO,
                                       divisa = svc.DIVISA,
                                       idServicioSF = svc.ID_SERVICIOSDFC,
                                       fecha_preventa = svc.FECHA_INSTALACION_PREVENTA,
                                       fecha_preventa2 = "",
                                       fecha_coordinada = svc.FECHA_PROGRAMADA_INSTALACION,
                                       fecha_coordinada2 = ""
                                   });

                    dt = ConvertData.ToDataTable(detail2);
                    break;

                case PropertiesApp.Jerarquia.Cliente:
                    var detail3 = (from svc in DataContext.SERVICIO
                                   join pj in DataContext.PROYECTO on svc.ID_PROYECTOSFDC equals pj.ID_PROYECTOSFDC
                                   join ccf in DataContext.CUENTA_CLIENTEFINAL on pj.ID_CUENTASDFC_ID_CLIENTEFINALSDFC equals ccf.ID_CUENTASDFC_ID_CLIENTEFINALSDFC
                                   join cf in DataContext.CLIENTE_FINAL on ccf.ID_CLIENTEFINALSDFC equals cf.ID_CLIENTEFINALSDFC.Substring(0, 15)
                                   where cf.ID_CLIENTEFINALSDFC == id && estados.Contains(svc.ESTADO_SERVICIO)
                                   && svc.TIPO_FLUJO == FLUJO_TRASLADO
                                   select new
                                   {
                                       nombre_cliente = cf.NOMBRE_CLIENTEFINAL,
                                       nombre_proyecto = pj.NOMBRE_PROYECTO,
                                       nombre_servicio = svc.NOMBRE_SERVICIO,
                                       idservicio = svc.ID_SERVICIO,
                                       numero_cpa = svc.NUMERO_CPA,
                                       velocidad = svc.VELOCIDAD,
                                       tecnologia = svc.TECNOLOGIA,
                                       fecha_activacion = svc.FECHA_ACTIVACION,
                                       estado_servicio = svc.ESTADO_SERVICIO,
                                       localizacion = svc.LOCALIZACION,
                                       valor_producto = svc.VALOR_PRODUCTO,
                                       divisa = svc.DIVISA,
                                       idServicioSF = svc.ID_SERVICIOSDFC,
                                       fecha_preventa = svc.FECHA_INSTALACION_PREVENTA,
                                       fecha_preventa2 = "",
                                       fecha_coordinada = svc.FECHA_PROGRAMADA_INSTALACION,
                                       fecha_coordinada2 = ""
                                   });

                    dt = ConvertData.ToDataTable(detail3);
                    break;
                case PropertiesApp.Jerarquia.Todos:
                    var detail4 = (from svc in DataContext.SERVICIO
                                   join pj in DataContext.PROYECTO on svc.ID_PROYECTOSFDC equals pj.ID_PROYECTOSFDC
                                   join ccf in DataContext.CUENTA_CLIENTEFINAL on pj.ID_CUENTASDFC_ID_CLIENTEFINALSDFC equals ccf.ID_CUENTASDFC_ID_CLIENTEFINALSDFC
                                   join cf in DataContext.CLIENTE_FINAL on ccf.ID_CLIENTEFINALSDFC equals cf.ID_CLIENTEFINALSDFC.Substring(0, 15)
                                   where ccf.ID_CUENTASFDC == idCuenta.Substring(0, 15) && estados.Contains(svc.ESTADO_SERVICIO)
                                   && svc.TIPO_FLUJO == FLUJO_TRASLADO
                                   select new
                                   {
                                       nombre_cliente = cf.NOMBRE_CLIENTEFINAL,
                                       nombre_proyecto = pj.NOMBRE_PROYECTO,
                                       nombre_servicio = svc.NOMBRE_SERVICIO,
                                       idservicio = svc.ID_SERVICIO,
                                       numero_cpa = svc.NUMERO_CPA,
                                       velocidad = svc.VELOCIDAD,
                                       tecnologia = svc.TECNOLOGIA,
                                       fecha_activacion = svc.FECHA_ACTIVACION,
                                       estado_servicio = svc.ESTADO_SERVICIO,
                                       localizacion = svc.LOCALIZACION,
                                       valor_producto = svc.VALOR_PRODUCTO,
                                       divisa = svc.DIVISA,
                                       idServicioSF = svc.ID_SERVICIOSDFC,
                                       fecha_preventa = svc.FECHA_INSTALACION_PREVENTA,
                                       fecha_preventa2 = "",
                                       fecha_coordinada = svc.FECHA_PROGRAMADA_INSTALACION,
                                       fecha_coordinada2 = ""
                                   });

                    dt = ConvertData.ToDataTable(detail4);
                    break;
                default:
                    return dt;
            }

            return dt;
        }

        /// <summary>
        /// Retorna información de los traslados que cumplen con los criterios de búsqueda
        /// </summary>
        /// <param name="id"></param>
        /// <param name="jerarquia"></param>
        /// <param name="busqueda"></param>
        /// <returns></returns>
        public static DataTable GetTransferDetailFinales(string id, PropertiesApp.Jerarquia jerarquia, string busqueda, string idCuenta)
        {
            DataTable dt = new DataTable();            
            string[] estados = new string[] { "CONTRATO FIRMADO", "EQUIPOS CONFIGURADOS", "EQUIPOS ENTREGADOS", "EQUIPOS ENTREGADOS PARA CONFIGURAR", "ESTUDIO EN SITIO", "INSTALADO", "PROGRAMADO PARA INSTALACION" };

            var detail = (from svc in DataContext.SERVICIO
                          join ccf in DataContext.CUENTA_CLIENTEFINAL on svc.ID_CUENTASFDC.Substring(0, 15) equals ccf.ID_CUENTASFDC
                          join cta in DataContext.CUENTA on svc.ID_CUENTASFDC equals cta.ID_CUENTASFDC
                          where ccf.ID_CUENTASFDC == idCuenta.Substring(0, 15) && estados.Contains(svc.ESTADO_SERVICIO)
                          && svc.TIPO_FLUJO == FLUJO_TRASLADO
                          && (
                          (busqueda == string.Empty ? true : SqlMethods.Like(cta.NOMBRE_CUENTA, "%" + busqueda + "%"))                          
                          || (busqueda == string.Empty ? true : SqlMethods.Like(svc.NOMBRE_SERVICIO, "%" + busqueda + "%"))
                          || (busqueda == string.Empty ? true : SqlMethods.Like(svc.ID_SERVICIO, "%" + busqueda + "%"))
                          || (busqueda == string.Empty ? true : SqlMethods.Like(svc.NUMERO_CPA, "%" + busqueda + "%"))
                          || (busqueda == string.Empty ? true : SqlMethods.Like(svc.VELOCIDAD, "%" + busqueda + "%"))
                          || (busqueda == string.Empty ? true : SqlMethods.Like(svc.TECNOLOGIA, "%" + busqueda + "%"))
                          || (busqueda == string.Empty ? true : SqlMethods.Like(svc.ESTADO_SERVICIO, "%" + busqueda + "%"))
                          || (busqueda == string.Empty ? true : SqlMethods.Like(svc.LOCALIZACION, "%" + busqueda + "%"))
                          )
                          select new
                          {
                              nombre_cliente = cta.NOMBRE_CUENTA,
                              nombre_proyecto = "",
                              nombre_servicio = svc.NOMBRE_SERVICIO,
                              idservicio = svc.ID_SERVICIO,
                              numero_cpa = svc.NUMERO_CPA,
                              velocidad = svc.VELOCIDAD,
                              tecnologia = svc.TECNOLOGIA,
                              fecha_activacion = svc.FECHA_ACTIVACION,
                              estado_servicio = svc.ESTADO_SERVICIO,
                              localizacion = svc.LOCALIZACION,
                              valor_producto = svc.VALOR_PRODUCTO,
                              divisa = svc.DIVISA,
                              idServicioSF = svc.ID_SERVICIOSDFC,
                              fecha_preventa = svc.FECHA_INSTALACION_PREVENTA,
                              fecha_preventa2 = "",
                              fecha_coordinada = svc.FECHA_PROGRAMADA_INSTALACION,
                              fecha_coordinada2 = ""
                          });

            dt = ConvertData.ToDataTable(detail);

            return dt;
        }



        /// <summary>
        /// Retorna información de los traslados que cumplen con los criterios de búsqueda
        /// </summary>
        /// <param name="id"></param>
        /// <param name="jerarquia"></param>
        /// <param name="busqueda"></param>
        /// <returns></returns>
        public static DataTable GetCancelDetailCorporativos(string id, PropertiesApp.Jerarquia jerarquia, string busqueda, string idCuenta)
        {
            DataTable dt = new DataTable();
            string[] estados = new string[] { "CANCELADO", "PROGRAMADO PARA DESINSTALACION" };

            switch (jerarquia)
            {
                case PropertiesApp.Jerarquia.Servicio:
                    var detail = (from svc in DataContext.SERVICIO
                                  join pj in DataContext.PROYECTO on svc.ID_PROYECTOSFDC equals pj.ID_PROYECTOSFDC
                                  join ccf in DataContext.CUENTA_CLIENTEFINAL on pj.ID_CUENTASDFC_ID_CLIENTEFINALSDFC equals ccf.ID_CUENTASDFC_ID_CLIENTEFINALSDFC
                                  join cf in DataContext.CLIENTE_FINAL on ccf.ID_CLIENTEFINALSDFC equals cf.ID_CLIENTEFINALSDFC.Substring(0, 15)
                                  where svc.ID_SERVICIOSDFC == id && estados.Contains(svc.ESTADO_SERVICIO)
                                  && svc.TIPO_FLUJO == FLUJO_CANCELACION 
                                  && (
                                  (busqueda == string.Empty ? true : SqlMethods.Like(cf.NOMBRE_CLIENTEFINAL, "%" + busqueda + "%"))
                                  || (busqueda == string.Empty ? true : SqlMethods.Like(pj.NOMBRE_PROYECTO, "%" + busqueda + "%"))
                                  || (busqueda == string.Empty ? true : SqlMethods.Like(svc.NOMBRE_SERVICIO, "%" + busqueda + "%"))
                                  || (busqueda == string.Empty ? true : SqlMethods.Like(svc.ID_SERVICIO, "%" + busqueda + "%"))
                                  || (busqueda == string.Empty ? true : SqlMethods.Like(svc.NUMERO_CPA, "%" + busqueda + "%"))
                                  || (busqueda == string.Empty ? true : SqlMethods.Like(svc.VELOCIDAD, "%" + busqueda + "%"))
                                  || (busqueda == string.Empty ? true : SqlMethods.Like(svc.TECNOLOGIA, "%" + busqueda + "%"))
                                  || (busqueda == string.Empty ? true : SqlMethods.Like(svc.ESTADO_SERVICIO, "%" + busqueda + "%"))
                                  || (busqueda == string.Empty ? true : SqlMethods.Like(svc.LOCALIZACION, "%" + busqueda + "%"))
                                  )
                                  select new
                                  {
                                      nombre_cliente = cf.NOMBRE_CLIENTEFINAL,
                                      nombre_proyecto = pj.NOMBRE_PROYECTO,
                                      nombre_servicio = svc.NOMBRE_SERVICIO,
                                      idservicio = svc.ID_SERVICIO,
                                      numero_cpa = svc.NUMERO_CPA,
                                      velocidad = svc.VELOCIDAD,
                                      tecnologia = svc.TECNOLOGIA,
                                      fecha_activacion = svc.FECHA_ACTIVACION,
                                      estado_servicio = svc.ESTADO_SERVICIO,
                                      localizacion = svc.LOCALIZACION,
                                      valor_producto = svc.VALOR_PRODUCTO,
                                      divisa = svc.DIVISA,
                                      idServicioSF = svc.ID_SERVICIOSDFC,
                                      fecha_preventa = svc.FECHA_INSTALACION_PREVENTA,
                                      fecha_preventa2 = "",
                                      fecha_coordinada = svc.FECHA_PROGRAMADA_INSTALACION,
                                      fecha_coordinada2 = ""
                                  });

                    dt = ConvertData.ToDataTable(detail);
                    break;
                case PropertiesApp.Jerarquia.Proyecto:
                    var detail2 = (from svc in DataContext.SERVICIO
                                   join pj in DataContext.PROYECTO on svc.ID_PROYECTOSFDC equals pj.ID_PROYECTOSFDC
                                   join ccf in DataContext.CUENTA_CLIENTEFINAL on pj.ID_CUENTASDFC_ID_CLIENTEFINALSDFC equals ccf.ID_CUENTASDFC_ID_CLIENTEFINALSDFC
                                   join cf in DataContext.CLIENTE_FINAL on ccf.ID_CLIENTEFINALSDFC equals cf.ID_CLIENTEFINALSDFC.Substring(0, 15)
                                   where pj.ID_PROYECTOSFDC == id && estados.Contains(svc.ESTADO_SERVICIO)
                                   && svc.TIPO_FLUJO == FLUJO_CANCELACION 
                                   && (
                                   (busqueda == string.Empty ? true : SqlMethods.Like(cf.NOMBRE_CLIENTEFINAL, "%" + busqueda + "%"))
                                   || (busqueda == string.Empty ? true : SqlMethods.Like(pj.NOMBRE_PROYECTO, "%" + busqueda + "%"))
                                   || (busqueda == string.Empty ? true : SqlMethods.Like(svc.NOMBRE_SERVICIO, "%" + busqueda + "%"))
                                   || (busqueda == string.Empty ? true : SqlMethods.Like(svc.ID_SERVICIO, "%" + busqueda + "%"))
                                   || (busqueda == string.Empty ? true : SqlMethods.Like(svc.NUMERO_CPA, "%" + busqueda + "%"))
                                   || (busqueda == string.Empty ? true : SqlMethods.Like(svc.VELOCIDAD, "%" + busqueda + "%"))
                                   || (busqueda == string.Empty ? true : SqlMethods.Like(svc.TECNOLOGIA, "%" + busqueda + "%"))
                                   || (busqueda == string.Empty ? true : SqlMethods.Like(svc.ESTADO_SERVICIO, "%" + busqueda + "%"))
                                   || (busqueda == string.Empty ? true : SqlMethods.Like(svc.LOCALIZACION, "%" + busqueda + "%"))
                                   )
                                   select new
                                   {
                                       nombre_cliente = cf.NOMBRE_CLIENTEFINAL,
                                       nombre_proyecto = pj.NOMBRE_PROYECTO,
                                       nombre_servicio = svc.NOMBRE_SERVICIO,
                                       idservicio = svc.ID_SERVICIO,
                                       numero_cpa = svc.NUMERO_CPA,
                                       velocidad = svc.VELOCIDAD,
                                       tecnologia = svc.TECNOLOGIA,
                                       fecha_activacion = svc.FECHA_ACTIVACION,
                                       estado_servicio = svc.ESTADO_SERVICIO,
                                       localizacion = svc.LOCALIZACION,
                                       valor_producto = svc.VALOR_PRODUCTO,
                                       divisa = svc.DIVISA,
                                       idServicioSF = svc.ID_SERVICIOSDFC,
                                       fecha_preventa = svc.FECHA_INSTALACION_PREVENTA,
                                       fecha_preventa2 = "",
                                       fecha_coordinada = svc.FECHA_PROGRAMADA_INSTALACION,
                                       fecha_coordinada2 = ""
                                   });

                    dt = ConvertData.ToDataTable(detail2);
                    break;

                case PropertiesApp.Jerarquia.Cliente:
                    var detail3 = (from svc in DataContext.SERVICIO
                                   join pj in DataContext.PROYECTO on svc.ID_PROYECTOSFDC equals pj.ID_PROYECTOSFDC
                                   join ccf in DataContext.CUENTA_CLIENTEFINAL on pj.ID_CUENTASDFC_ID_CLIENTEFINALSDFC equals ccf.ID_CUENTASDFC_ID_CLIENTEFINALSDFC
                                   join cf in DataContext.CLIENTE_FINAL on ccf.ID_CLIENTEFINALSDFC equals cf.ID_CLIENTEFINALSDFC.Substring(0, 15)
                                   where cf.ID_CLIENTEFINALSDFC == id && estados.Contains(svc.ESTADO_SERVICIO)
                                   && svc.TIPO_FLUJO == FLUJO_CANCELACION
                                   && (
                                   (busqueda == string.Empty ? true : SqlMethods.Like(cf.NOMBRE_CLIENTEFINAL, "%" + busqueda + "%"))
                                   || (busqueda == string.Empty ? true : SqlMethods.Like(pj.NOMBRE_PROYECTO, "%" + busqueda + "%"))
                                   || (busqueda == string.Empty ? true : SqlMethods.Like(svc.NOMBRE_SERVICIO, "%" + busqueda + "%"))
                                   || (busqueda == string.Empty ? true : SqlMethods.Like(svc.ID_SERVICIO, "%" + busqueda + "%"))
                                   || (busqueda == string.Empty ? true : SqlMethods.Like(svc.NUMERO_CPA, "%" + busqueda + "%"))
                                   || (busqueda == string.Empty ? true : SqlMethods.Like(svc.VELOCIDAD, "%" + busqueda + "%"))
                                   || (busqueda == string.Empty ? true : SqlMethods.Like(svc.TECNOLOGIA, "%" + busqueda + "%"))
                                   || (busqueda == string.Empty ? true : SqlMethods.Like(svc.ESTADO_SERVICIO, "%" + busqueda + "%"))
                                   || (busqueda == string.Empty ? true : SqlMethods.Like(svc.LOCALIZACION, "%" + busqueda + "%"))
                                   )
                                   select new
                                   {
                                       nombre_cliente = cf.NOMBRE_CLIENTEFINAL,
                                       nombre_proyecto = pj.NOMBRE_PROYECTO,
                                       nombre_servicio = svc.NOMBRE_SERVICIO,
                                       idservicio = svc.ID_SERVICIO,
                                       numero_cpa = svc.NUMERO_CPA,
                                       velocidad = svc.VELOCIDAD,
                                       tecnologia = svc.TECNOLOGIA,
                                       fecha_activacion = svc.FECHA_ACTIVACION,
                                       estado_servicio = svc.ESTADO_SERVICIO,
                                       localizacion = svc.LOCALIZACION,
                                       valor_producto = svc.VALOR_PRODUCTO,
                                       divisa = svc.DIVISA,
                                       idServicioSF = svc.ID_SERVICIOSDFC,
                                       fecha_preventa = svc.FECHA_INSTALACION_PREVENTA,
                                       fecha_preventa2 = "",
                                       fecha_coordinada = svc.FECHA_PROGRAMADA_INSTALACION,
                                       fecha_coordinada2 = ""
                                   });

                    dt = ConvertData.ToDataTable(detail3);
                    break;
                case PropertiesApp.Jerarquia.Todos:
                    var detail4 = (from svc in DataContext.SERVICIO
                                   join pj in DataContext.PROYECTO on svc.ID_PROYECTOSFDC equals pj.ID_PROYECTOSFDC
                                   join ccf in DataContext.CUENTA_CLIENTEFINAL on pj.ID_CUENTASDFC_ID_CLIENTEFINALSDFC equals ccf.ID_CUENTASDFC_ID_CLIENTEFINALSDFC
                                   join cf in DataContext.CLIENTE_FINAL on ccf.ID_CLIENTEFINALSDFC equals cf.ID_CLIENTEFINALSDFC.Substring(0, 15)
                                   where ccf.ID_CUENTASFDC == idCuenta.Substring(0, 15) && estados.Contains(svc.ESTADO_SERVICIO)
                                   && svc.TIPO_FLUJO == FLUJO_CANCELACION
                                   && (
                                   (busqueda == string.Empty ? true : SqlMethods.Like(cf.NOMBRE_CLIENTEFINAL, "%" + busqueda + "%"))
                                   || (busqueda == string.Empty ? true : SqlMethods.Like(pj.NOMBRE_PROYECTO, "%" + busqueda + "%"))
                                   || (busqueda == string.Empty ? true : SqlMethods.Like(svc.NOMBRE_SERVICIO, "%" + busqueda + "%"))
                                   || (busqueda == string.Empty ? true : SqlMethods.Like(svc.ID_SERVICIO, "%" + busqueda + "%"))
                                   || (busqueda == string.Empty ? true : SqlMethods.Like(svc.NUMERO_CPA, "%" + busqueda + "%"))
                                   || (busqueda == string.Empty ? true : SqlMethods.Like(svc.VELOCIDAD, "%" + busqueda + "%"))
                                   || (busqueda == string.Empty ? true : SqlMethods.Like(svc.TECNOLOGIA, "%" + busqueda + "%"))
                                   || (busqueda == string.Empty ? true : SqlMethods.Like(svc.ESTADO_SERVICIO, "%" + busqueda + "%"))
                                   || (busqueda == string.Empty ? true : SqlMethods.Like(svc.LOCALIZACION, "%" + busqueda + "%"))
                                   )
                                   select new
                                   {
                                       nombre_cliente = cf.NOMBRE_CLIENTEFINAL,
                                       nombre_proyecto = pj.NOMBRE_PROYECTO,
                                       nombre_servicio = svc.NOMBRE_SERVICIO,
                                       idservicio = svc.ID_SERVICIO,
                                       numero_cpa = svc.NUMERO_CPA,
                                       velocidad = svc.VELOCIDAD,
                                       tecnologia = svc.TECNOLOGIA,
                                       fecha_activacion = svc.FECHA_ACTIVACION,
                                       estado_servicio = svc.ESTADO_SERVICIO,
                                       localizacion = svc.LOCALIZACION,
                                       valor_producto = svc.VALOR_PRODUCTO,
                                       divisa = svc.DIVISA,
                                       idServicioSF = svc.ID_SERVICIOSDFC,
                                       fecha_preventa = svc.FECHA_INSTALACION_PREVENTA,
                                       fecha_preventa2 = "",
                                       fecha_coordinada = svc.FECHA_PROGRAMADA_INSTALACION,
                                       fecha_coordinada2 = ""
                                   });

                    dt = ConvertData.ToDataTable(detail4);
                    break;
                default:
                    return dt;
            }

            return dt;
        }

        /// <summary>
        /// Retorna información de los traslados que cumplen con los criterios de búsqueda
        /// </summary>
        /// <param name="id"></param>
        /// <param name="jerarquia"></param>        
        /// <returns></returns>
        public static DataTable GetCancelDetailCorporativos(string id, PropertiesApp.Jerarquia jerarquia, string idCuenta)
        {
            DataTable dt = new DataTable();
            string[] estados = new string[] { "CANCELADO", "PROGRAMADO PARA DESINSTALACION" };            

            switch (jerarquia)
            {
                case PropertiesApp.Jerarquia.Servicio:
                    var detail = (from svc in DataContext.SERVICIO
                                  join pj in DataContext.PROYECTO on svc.ID_PROYECTOSFDC equals pj.ID_PROYECTOSFDC
                                  join ccf in DataContext.CUENTA_CLIENTEFINAL on pj.ID_CUENTASDFC_ID_CLIENTEFINALSDFC equals ccf.ID_CUENTASDFC_ID_CLIENTEFINALSDFC
                                  join cf in DataContext.CLIENTE_FINAL on ccf.ID_CLIENTEFINALSDFC equals cf.ID_CLIENTEFINALSDFC.Substring(0, 15)
                                  where svc.ID_SERVICIOSDFC == id && estados.Contains(svc.ESTADO_SERVICIO)
                                  && svc.TIPO_FLUJO == FLUJO_CANCELACION
                                  select new
                                  {
                                      nombre_cliente = cf.NOMBRE_CLIENTEFINAL,
                                      nombre_proyecto = pj.NOMBRE_PROYECTO,
                                      nombre_servicio = svc.NOMBRE_SERVICIO,
                                      idservicio = svc.ID_SERVICIO,
                                      numero_cpa = svc.NUMERO_CPA,
                                      velocidad = svc.VELOCIDAD,
                                      tecnologia = svc.TECNOLOGIA,
                                      fecha_activacion = svc.FECHA_ACTIVACION,
                                      estado_servicio = svc.ESTADO_SERVICIO,
                                      localizacion = svc.LOCALIZACION,
                                      valor_producto = svc.VALOR_PRODUCTO,
                                      divisa = svc.DIVISA,
                                      idServicioSF = svc.ID_SERVICIOSDFC,
                                      fecha_preventa = svc.FECHA_INSTALACION_PREVENTA,
                                      fecha_preventa2 = "",
                                      fecha_coordinada = svc.FECHA_PROGRAMADA_INSTALACION,
                                      fecha_coordinada2 = ""
                                  });

                    dt = ConvertData.ToDataTable(detail);
                    break;
                case PropertiesApp.Jerarquia.Proyecto:
                    var detail2 = (from svc in DataContext.SERVICIO
                                   join pj in DataContext.PROYECTO on svc.ID_PROYECTOSFDC equals pj.ID_PROYECTOSFDC
                                   join ccf in DataContext.CUENTA_CLIENTEFINAL on pj.ID_CUENTASDFC_ID_CLIENTEFINALSDFC equals ccf.ID_CUENTASDFC_ID_CLIENTEFINALSDFC
                                   join cf in DataContext.CLIENTE_FINAL on ccf.ID_CLIENTEFINALSDFC equals cf.ID_CLIENTEFINALSDFC.Substring(0, 15)
                                   where pj.ID_PROYECTOSFDC == id && estados.Contains(svc.ESTADO_SERVICIO)
                                   && svc.TIPO_FLUJO == FLUJO_CANCELACION
                                   select new
                                   {
                                       nombre_cliente = cf.NOMBRE_CLIENTEFINAL,
                                       nombre_proyecto = pj.NOMBRE_PROYECTO,
                                       nombre_servicio = svc.NOMBRE_SERVICIO,
                                       idservicio = svc.ID_SERVICIO,
                                       numero_cpa = svc.NUMERO_CPA,
                                       velocidad = svc.VELOCIDAD,
                                       tecnologia = svc.TECNOLOGIA,
                                       fecha_activacion = svc.FECHA_ACTIVACION,
                                       estado_servicio = svc.ESTADO_SERVICIO,
                                       localizacion = svc.LOCALIZACION,
                                       valor_producto = svc.VALOR_PRODUCTO,
                                       divisa = svc.DIVISA,
                                       idServicioSF = svc.ID_SERVICIOSDFC,
                                       fecha_preventa = svc.FECHA_INSTALACION_PREVENTA,
                                       fecha_preventa2 = "",
                                       fecha_coordinada = svc.FECHA_PROGRAMADA_INSTALACION,
                                       fecha_coordinada2 = ""
                                   });

                    dt = ConvertData.ToDataTable(detail2);
                    break;

                case PropertiesApp.Jerarquia.Cliente:
                    var detail3 = (from svc in DataContext.SERVICIO
                                   join pj in DataContext.PROYECTO on svc.ID_PROYECTOSFDC equals pj.ID_PROYECTOSFDC
                                   join ccf in DataContext.CUENTA_CLIENTEFINAL on pj.ID_CUENTASDFC_ID_CLIENTEFINALSDFC equals ccf.ID_CUENTASDFC_ID_CLIENTEFINALSDFC
                                   join cf in DataContext.CLIENTE_FINAL on ccf.ID_CLIENTEFINALSDFC equals cf.ID_CLIENTEFINALSDFC.Substring(0, 15)
                                   where cf.ID_CLIENTEFINALSDFC == id && estados.Contains(svc.ESTADO_SERVICIO)
                                   && svc.TIPO_FLUJO == FLUJO_CANCELACION
                                   select new
                                   {
                                       nombre_cliente = cf.NOMBRE_CLIENTEFINAL,
                                       nombre_proyecto = pj.NOMBRE_PROYECTO,
                                       nombre_servicio = svc.NOMBRE_SERVICIO,
                                       idservicio = svc.ID_SERVICIO,
                                       numero_cpa = svc.NUMERO_CPA,
                                       velocidad = svc.VELOCIDAD,
                                       tecnologia = svc.TECNOLOGIA,
                                       fecha_activacion = svc.FECHA_ACTIVACION,
                                       estado_servicio = svc.ESTADO_SERVICIO,
                                       localizacion = svc.LOCALIZACION,
                                       valor_producto = svc.VALOR_PRODUCTO,
                                       divisa = svc.DIVISA,
                                       idServicioSF = svc.ID_SERVICIOSDFC,
                                       fecha_preventa = svc.FECHA_INSTALACION_PREVENTA,
                                       fecha_preventa2 = "",
                                       fecha_coordinada = svc.FECHA_PROGRAMADA_INSTALACION,
                                       fecha_coordinada2 = ""
                                   });

                    dt = ConvertData.ToDataTable(detail3);
                    break;
                case PropertiesApp.Jerarquia.Todos:
                    var detail4 = (from svc in DataContext.SERVICIO
                                   join pj in DataContext.PROYECTO on svc.ID_PROYECTOSFDC equals pj.ID_PROYECTOSFDC
                                   join ccf in DataContext.CUENTA_CLIENTEFINAL on pj.ID_CUENTASDFC_ID_CLIENTEFINALSDFC equals ccf.ID_CUENTASDFC_ID_CLIENTEFINALSDFC
                                   join cf in DataContext.CLIENTE_FINAL on ccf.ID_CLIENTEFINALSDFC equals cf.ID_CLIENTEFINALSDFC.Substring(0, 15)
                                   where ccf.ID_CUENTASFDC == idCuenta.Substring(0, 15) && estados.Contains(svc.ESTADO_SERVICIO)
                                   && svc.TIPO_FLUJO == FLUJO_CANCELACION
                                   select new
                                   {
                                       nombre_cliente = cf.NOMBRE_CLIENTEFINAL,
                                       nombre_proyecto = pj.NOMBRE_PROYECTO,
                                       nombre_servicio = svc.NOMBRE_SERVICIO,
                                       idservicio = svc.ID_SERVICIO,
                                       numero_cpa = svc.NUMERO_CPA,
                                       velocidad = svc.VELOCIDAD,
                                       tecnologia = svc.TECNOLOGIA,
                                       fecha_activacion = svc.FECHA_ACTIVACION,
                                       estado_servicio = svc.ESTADO_SERVICIO,
                                       localizacion = svc.LOCALIZACION,
                                       valor_producto = svc.VALOR_PRODUCTO,
                                       divisa = svc.DIVISA,
                                       idServicioSF = svc.ID_SERVICIOSDFC,
                                       fecha_preventa = svc.FECHA_INSTALACION_PREVENTA,
                                       fecha_preventa2 = "",
                                       fecha_coordinada = svc.FECHA_PROGRAMADA_INSTALACION,
                                       fecha_coordinada2 = ""
                                   });

                    dt = ConvertData.ToDataTable(detail4);
                    break;
                default:
                    return dt;
            }

            return dt;
        }


        /// <summary>
        /// Retorna información de los traslados que cumplen con los criterios de búsqueda
        /// </summary>
        /// <param name="id"></param>
        /// <param name="jerarquia"></param>
        /// <param name="busqueda"></param>
        /// <returns></returns>
        public static DataTable GetCancelDetailFinales(string id, PropertiesApp.Jerarquia jerarquia, string busqueda, string idCuenta)
        {
            DataTable dt = new DataTable();
            string[] estados = new string[] { "CANCELADO", "PROGRAMADO PARA DESINSTALACION" };            

            var detail = (from svc in DataContext.SERVICIO
                          join ccf in DataContext.CUENTA_CLIENTEFINAL on svc.ID_CUENTASFDC.Substring(0, 15) equals ccf.ID_CUENTASFDC
                          join cta in DataContext.CUENTA on svc.ID_CUENTASFDC equals cta.ID_CUENTASFDC
                          where ccf.ID_CUENTASFDC == idCuenta.Substring(0, 15) && estados.Contains(svc.ESTADO_SERVICIO)
                          && svc.TIPO_FLUJO == FLUJO_CANCELACION
                          && (
                          (busqueda == string.Empty ? true : SqlMethods.Like(cta.NOMBRE_CUENTA, "%" + busqueda + "%"))                          
                          || (busqueda == string.Empty ? true : SqlMethods.Like(svc.NOMBRE_SERVICIO, "%" + busqueda + "%"))
                          || (busqueda == string.Empty ? true : SqlMethods.Like(svc.ID_SERVICIO, "%" + busqueda + "%"))
                          || (busqueda == string.Empty ? true : SqlMethods.Like(svc.NUMERO_CPA, "%" + busqueda + "%"))
                          || (busqueda == string.Empty ? true : SqlMethods.Like(svc.VELOCIDAD, "%" + busqueda + "%"))
                          || (busqueda == string.Empty ? true : SqlMethods.Like(svc.TECNOLOGIA, "%" + busqueda + "%"))
                          || (busqueda == string.Empty ? true : SqlMethods.Like(svc.ESTADO_SERVICIO, "%" + busqueda + "%"))
                          || (busqueda == string.Empty ? true : SqlMethods.Like(svc.LOCALIZACION, "%" + busqueda + "%"))
                          )
                          select new
                          {
                              nombre_cliente = cta.NOMBRE_CUENTA,
                              nombre_proyecto = "",
                              nombre_servicio = svc.NOMBRE_SERVICIO,
                              idservicio = svc.ID_SERVICIO,
                              numero_cpa = svc.NUMERO_CPA,
                              velocidad = svc.VELOCIDAD,
                              tecnologia = svc.TECNOLOGIA,
                              fecha_activacion = svc.FECHA_ACTIVACION,
                              estado_servicio = svc.ESTADO_SERVICIO,
                              localizacion = svc.LOCALIZACION,
                              valor_producto = svc.VALOR_PRODUCTO,
                              divisa = svc.DIVISA,
                              idServicioSF = svc.ID_SERVICIOSDFC,
                              fecha_preventa = svc.FECHA_INSTALACION_PREVENTA,
                              fecha_preventa2 = "",
                              fecha_coordinada = svc.FECHA_PROGRAMADA_INSTALACION,
                              fecha_coordinada2 = ""
                          });

            dt = ConvertData.ToDataTable(detail);

            return dt;
        }

        #endregion

        /// <summary>
        /// Retorna lista de servicios que cumplen con el criterio de busqueda
        /// </summary>
        /// <param name="tipoBusqueda">1: Servicio, 2:CPA, 3:Tecnologia</param>
        /// <param name="busqueda">palabra a buscar en la columna determinada por el parametro anterior(tuipoBusqueda)</param>
        /// <returns></returns>
        public static string[] GetServiceSearch(string tipoBusqueda, string busqueda, string nit)
        {
            if (tipoBusqueda == "1")
            {
                var q = (from s in DataContext.SERVICIO
                         join c in DataContext.CUENTA on s.ID_CUENTASFDC equals c.ID_CUENTASFDC
                         where SqlMethods.Like(s.NOMBRE_SERVICIO, "%" + busqueda + "%")
                         && c.NIT_CUENTA == nit && (!s.ESTADO_SERVICIO.ToUpper().Contains("CANCELADO"))
                         select s.NOMBRE_SERVICIO);

                return q.ToArray<string>();
            }
            if (tipoBusqueda == "2")
            {
                var q2 = (from s in DataContext.SERVICIO
                          join c in DataContext.CUENTA on s.ID_CUENTASFDC equals c.ID_CUENTASFDC
                         where SqlMethods.Like(s.NUMERO_CPA, "%" + busqueda + "%")
                         && c.NIT_CUENTA == nit && (!s.ESTADO_SERVICIO.ToUpper().Contains("CANCELADO"))
                         select s.NOMBRE_SERVICIO);

                return q2.ToArray<string>();            
            }
            if (tipoBusqueda == "3")
            {
                var q3 = (from s in DataContext.SERVICIO
                          join c in DataContext.CUENTA on s.ID_CUENTASFDC equals c.ID_CUENTASFDC
                          where SqlMethods.Like(s.TECNOLOGIA, "%" + busqueda + "%")
                          && c.NIT_CUENTA == nit && (!s.ESTADO_SERVICIO.ToUpper().Contains("CANCELADO"))
                          select s.NOMBRE_SERVICIO);

                return q3.ToArray<string>();
            }
            else
            {
                string[] arrRetorno = new string[] { "" };
                return arrRetorno;
            }

        }

        /// <summary>
        /// Retorna un arreglo con los estados por los que puede pasar un servicio, dependiendo del cliente y tipo
        /// de servicio
        /// </summary>
        /// <param name="serv">Servicio del que se desea consultar el flujo</param>
        /// <returns></returns>
        public static DataTable GetFlow(SERVICIO serv)
        { 
            //Se obtiene la cuenta para averiguar el tipo de cliente
            var cuenta = (from c in DataContext.CUENTA
                          where c.ID_CUENTASFDC == serv.ID_CUENTASFDC
                          select c).FirstOrDefault();

            //Se obtiene el flujo correspondiente al servicio
            //var flujo = from e in DataContext.ESTADO_FLUJO
            //            join f in DataContext.FLUJO on e.ID_FLUJO equals f.ID_FLUJO
            //            where f.ORIGEN_ENLACE == serv.ORIGEN_ENLACE && f.TIPO_SERVICIO == serv.TIPO_SERVICIO
            //            && f.ESTADO_SERVICIO == serv.ESTADO_SERVICIO
            //            orderby e.ORDEN
            //            select e;

            DataTable retorno = new DataTable();
            retorno.Columns.Add("ESTADO");
            retorno.Columns.Add("DESCRIPCION");
            DataRow dr;

            string tipoFlujo = "";
            if (serv.TIPO_FLUJO == null)
                return retorno;

            if (serv.TIPO_FLUJO.Equals("FLUJO DE CANCELACION"))
                tipoFlujo = "CANCELACION";
            else if (serv.TIPO_FLUJO.Equals("FLUJO INSTALACION"))
                tipoFlujo = "INSTALACION";
            else if (serv.TIPO_FLUJO.Equals("FLUJO TRASLADO"))
                tipoFlujo = "TRASLADO";

            var flujo = from e in DataContext.ESTADO_FLUJO
                        join f in DataContext.FLUJO on e.ID_FLUJO equals f.ID_FLUJO
                        where f.ORIGEN_ENLACE == tipoFlujo
                        orderby e.ORDEN
                        select e;


            //bool cancelacion = false;
            if (cuenta != null)
            {


                //Se recorren los estados y se retorna arreglo con los estados
                foreach (ESTADO_FLUJO estado in flujo)
                {
                    dr = retorno.NewRow();
                    dr["ESTADO"] = estado.ESTADO;
                    dr["DESCRIPCION"] = estado.DESCRIPCION;
                    retorno.Rows.Add(dr);
                }


                ////Si el estado del servicio contiene alguna de estos estados, se retorna flujo de cancelacion
                //if ((serv.ESTADO_SERVICIO.Contains("CANCELADO")) || (serv.ESTADO_SERVICIO.Contains("PROGRAMADO DESINSTALACION")) || (serv.ESTADO_SERVICIO.Contains("DESINSTALADO")))
                //    cancelacion = true;

                //if (serv.ORIGEN_ENLACE == ORIGEN_ENLACE_NUEVO)
                //{
                //    if ((serv.TIPO_SERVICIO == TIPO_SERVICIO_INTERNET) && (!cancelacion))
                //        retorno = new string[] { "APROBADO AREA DE CREDITO", "PROGRAMADA PARA INSTALACIÓN", "EQUIPOS ENTREGADOS PARA CONFIGURAR",
                //        "EQUIPOS CONFIGURADOS", "EQUIPOS ENTREGADOS", "ACTIVO" };
                //    else if ((serv.TIPO_SERVICIO == TIPO_SERVICIO_SCPC) && (!cancelacion))
                //        retorno = new string[] { "APROBADO AREA DE CREDITO", "APROBADO PREVENTA", "PROGRAMADA PARA INSTALACIÓN", 
                //        "EQUIPOS ENTREGADOS PARA CONFIGURAR", "EQUIPOS CONFIGURADOS",
                //        "EQUIPOS ENTREGADOS", "ACTIVO" };
                //    else if (((serv.TIPO_SERVICIO == TIPO_SERVICIO_INTERNET) || (serv.TIPO_SERVICIO == TIPO_SERVICIO_SCPC)) && (cancelacion))
                //        retorno = new string[] { "CANCELADO – ANTENA DEL CLIENTE", "CANCELADO", "PROGRAMADO DESINSTALACION",
                //        "DESINSTALADO" };
                //    else if ((serv.TIPO_SERVICIO == TIPO_SERVICIO_INTERNACIONAL) && (!cancelacion))
                //        retorno = new string[] { "ACTIVO" };
                //    else if ((serv.TIPO_SERVICIO == TIPO_SERVICIO_INTERNACIONAL) && (cancelacion))
                //        retorno = new string[] { "CANCELADO" };
                //}
                //else if (serv.ORIGEN_ENLACE == ORIGEN_ENLACE_TRASLADO)
                //{
                //    retorno = new string[] { "ACTIVO" };
                //}
            }
            else
            {
                throw new Exception("No se encontró la cuenta de este servicio");
            }

            return retorno;

        }

        /// <summary>
        /// Retorna el servicio que coincide con el nombre que recibe
        /// </summary>
        /// <param name="name"></param>
        /// <returns></returns>
        public static SERVICIO GetByName(string name)
        { 
            var q = (from s in DataContext.SERVICIO
                    where s.NOMBRE_SERVICIO == name
                    select s).FirstOrDefault();            

            return q;
        }

        /// <summary>
        /// Retorna la cantidad de servicios activos de un nit
        /// </summary>
        /// <param name="nit">Nit a consultar</param>
        /// <returns></returns>
        public static int GetCantidadServiciosByCuenta(string nit)
        {
            return (from s in DataContext.SERVICIO
                      join c in DataContext.CUENTA on s.ID_CUENTASFDC equals c.ID_CUENTASFDC
                        where c.NIT_CUENTA == nit && (!s.ESTADO_SERVICIO.ToUpper().Contains("CANCELADO"))
                      select s).Count();        
        }

        #endregion

        /// <summary>
        /// Actualiza el estado de un servicio
        /// </summary>
        /// <param name="idServicioSFDC"></param>
        /// <param name="estadoServicio"></param>
        /// <param name="Comentario"></param>
        /// <returns></returns>
        public static string SetStatus(string idServicioSFDC, string estadoServicio, string Comentario)
        {
            string statusWS = PropertiesApp.StatusWS.Exitosa.ToString();
            string statusObservation = string.Empty;

            try
            {
                SERVICIO SVC = (from r in DataContext.SERVICIO
                                where r.ID_SERVICIOSDFC == idServicioSFDC
                                select r).SingleOrDefault();

                if (SVC != null)
                {
                    SVC.ESTADO_SERVICIO = estadoServicio;
                    SVC.COMENTARIO = Comentario;
                    DataContext.SubmitChanges();
                }
                else
                {
                    statusWS = PropertiesApp.StatusWS.Fallida.ToString();
                    statusObservation = "No existe ningun servicio para el ID: " + idServicioSFDC;
                    LogErrorController.Insert(PropertiesApp.Error.Service, statusObservation);
                }

            }
            catch (Exception EX)
            {
                statusWS = PropertiesApp.StatusWS.Fallida.ToString();
                statusObservation = "No se pudo actualizar el objeto Servicio, revise los parametros.";
                LogErrorController.Insert(PropertiesApp.Error.Service, EX.ToString());
            }


            XElement xmlData = new XElement("result");

            xmlData.Add(new XElement("TipoTransaccion", "ACTUALIZACION ESTADO SERVICIO"),
                    new XElement("ElementoEnviado", new XElement("IdServicioSFDC", idServicioSFDC),
                                                 new XElement("estadoServicio", estadoServicio),
                                                 new XElement("Comentario", Comentario)),
                    new XElement("EstadoTransaccion", statusWS),
                    new XElement("Observaciones", statusObservation),
                    new XElement("FechaTransaccion", DateTime.Now.ToString()));

            return xmlData.ToString();
               
        }

        /// <summary>
        /// Retorna un SERVICIO, dado su id
        /// </summary>
        /// <param name="idServicio">Id del servicio en sales force</param>
        /// <returns></returns>
        public static SERVICIO GetServiceById(string idServicio)
        {
            var q = (from s in DataContext.SERVICIO
                     where s.ID_SERVICIOSDFC == idServicio
                     select s).SingleOrDefault();

            if (q == null)
                throw new Exception("No se encontró el servicio");

            return q;
        }

        /// <summary>
        /// Retorna toda la info relacionada con un servicio
        /// </summary>
        /// <param name="idServicio"></param>
        /// <returns></returns>
        public static DataTable GetServiceDetail(string idServicio, TipoCliente tipoCliente)
        {
            if ((tipoCliente == TipoCliente.CORPORATIVOS) || (tipoCliente == TipoCliente.INTERNACIONALES))
                return GetServiceDetailCorporativo(idServicio);
            else
                return GetServiceDetailFinales(idServicio);

        }

        /// <summary>
        /// Retorna toda la info relacionada con un servicio
        /// </summary>
        /// <param name="idServicio"></param>
        /// <returns></returns>
        public static DataTable GetServiceDetailCorporativo(string idServicio)
        {
            var q = from ser in DataContext.SERVICIO
                    join ccf in DataContext.CUENTA_CLIENTEFINAL on ser.ID_CUENTASFDC.Substring(0, 15) equals ccf.ID_CUENTASFDC
                    join cli in DataContext.CLIENTE_FINAL on ccf.ID_CLIENTEFINALSDFC equals cli.ID_CLIENTEFINALSDFC.Substring(0, 15)
                    where ser.ID_SERVICIOSDFC == idServicio
                    select new
                    {
                        cliente = cli.NOMBRE_CLIENTEFINAL,
                        proyecto = ser.ID_PROYECTOSFDC,
                        nombre = ser.NOMBRE_SERVICIO,
                        localizacion = ser.LOCALIZACION,
                        idServicio = ser.ID_SERVICIO,
                        idServicioAliado = ser.ID_SERVICIO_ALIADO,
                        duracion = ser.DURACION_CONTRATO,
                        estado = ser.ESTADO_SERVICIO,
                        fechaFirma = ser.FECHA_FIRMA_CONTRATO,
                        cpa = ser.NUMERO_CPA,
                        tecnologia = ser.TECNOLOGIA,
                        satelite = ser.SATELITE,
                        tipoRegistro = ser.TIPO_SERVICIO,
                        fechaActivacion = ser.FECHA_ACTIVACION,
                        direccionIP = ser.DIRECCION_IP,
                        mascara = ser.MASCARA,
                        vlan = ser.VLAN,
                        cbr = ser.VINCULO_MRG,
                        idServicioSF = ser.ID_SERVICIOSDFC,
                        direccion = ser.DIRECCION
                    };

            DataTable dt = ConvertData.ToDataTable(q);

            //Se obtiene el nombre del proyecto y el nombre del cliente final
            if (dt.Rows.Count > 0)
            {                
                var q2 = (from pro in DataContext.PROYECTO
                          join cli in DataContext.CLIENTE_FINAL on pro.ID_CLIENTE_FINAL equals cli.ID_CLIENTEFINALSDFC.Substring(0, 15)
                          where pro.ID_PROYECTOSFDC == dt.Rows[0]["proyecto"].ToString()
                          select new
                          {
                              proyecto = pro.NOMBRE_PROYECTO,
                              cliente = cli.NOMBRE_CLIENTEFINAL
                          }).FirstOrDefault();

                if (q2 == null)
                {
                    dt.Rows[0]["proyecto"] = "";
                    dt.Rows[0]["cliente"] = "";
                }
                else
                {
                    dt.Rows[0]["proyecto"] = q2.proyecto;
                    dt.Rows[0]["cliente"] = q2.cliente;
                }                
                            
            }

            return dt;

        }

        /// <summary>
        /// Retorna toda la info relacionada con un servicio
        /// </summary>
        /// <param name="idServicio"></param>
        /// <returns></returns>
        public static DataTable GetServiceDetailFinales(string idServicio)
        {            
            var q = from ser in DataContext.SERVICIO
                    join ccf in DataContext.CUENTA_CLIENTEFINAL on ser.ID_CUENTASFDC.Substring(0, 15) equals ccf.ID_CUENTASFDC
                    join cta in DataContext.CUENTA on ser.ID_CUENTASFDC equals cta.ID_CUENTASFDC
                    where ser.ID_SERVICIOSDFC == idServicio
                    select new
                    {
                        cliente = cta.NOMBRE_CUENTA,
                        proyecto = ser.ID_PROYECTOSFDC,
                        nombre = ser.NOMBRE_SERVICIO,
                        localizacion = ser.LOCALIZACION,
                        idServicio = ser.ID_SERVICIO,
                        idServicioAliado = ser.ID_SERVICIO_ALIADO,
                        duracion = ser.DURACION_CONTRATO,
                        estado = ser.ESTADO_SERVICIO,
                        fechaFirma = ser.FECHA_FIRMA_CONTRATO,
                        cpa = ser.NUMERO_CPA,
                        tecnologia = ser.TECNOLOGIA,
                        satelite = ser.SATELITE,
                        tipoRegistro = ser.TIPO_SERVICIO,
                        fechaActivacion = ser.FECHA_ACTIVACION,
                        direccionIP = ser.DIRECCION_IP,
                        mascara = ser.MASCARA,
                        vlan = ser.VLAN,
                        cbr = ser.VINCULO_MRG,
                        idServicioSF = ser.ID_SERVICIOSDFC,
                        direccion = ser.DIRECCION
                    };

            DataTable dt = ConvertData.ToDataTable(q);

            //Se obtiene el nombre del proyecto
            if (dt.Rows.Count > 0)
            {
                var q2 = (from pro in DataContext.PROYECTO
                          where pro.ID_PROYECTOSFDC == dt.Rows[0]["proyecto"].ToString()
                          select pro).FirstOrDefault();

                if (q2 == null)
                    dt.Rows[0]["proyecto"] = "";
                else
                    dt.Rows[0]["proyecto"] = q2.NOMBRE_PROYECTO;

            }

            return dt;

        }

        #region "Utilizado para home internacional"

        /// <summary>
        /// Retorna datatable con la cantidad de servicios por estado
        /// </summary>
        /// <param name="nit"></param>
        /// <returns></returns>
        public static DataTable GetCantidadServiciosByEstado(string nit)
        {
            var q = from s in DataContext.SERVICIO
                    join c in DataContext.CUENTA on s.ID_CUENTASFDC equals c.ID_CUENTASFDC
                    where c.NIT_CUENTA == nit && s.ORIGEN_ENLACE != "DEMO"
                    group s by new {s.ESTADO_SERVICIO} into g
                    orderby g.Key.ESTADO_SERVICIO
                    select new
                    {                        
                        estado = g.Key.ESTADO_SERVICIO,
                        cantidad = g.Count()
                    };

            return ConvertData.ToDataTable(q);        
        }

        /// <summary>
        /// Retorna cantidad de servicios activos, agrupados por plataforma
        /// </summary>
        /// <param name="nit"></param>
        /// <returns></returns>
        public static DataTable GetCantidadServiciosByPlataforma(string nit)
        {
            var q = from s in DataContext.SERVICIO
                    join c in DataContext.CUENTA on s.ID_CUENTASFDC equals c.ID_CUENTASFDC
                    where c.NIT_CUENTA == nit && s.ESTADO_SERVICIO.Equals("ACTIVO") && s.TECNOLOGIA.Length > 0
                    group s by new { s.TECNOLOGIA } into g
                    orderby g.Key.TECNOLOGIA
                    select new
                    {                        
                        plataforma = g.Key.TECNOLOGIA,
                        cantidad = g.Count()
                    };

            return ConvertData.ToDataTable(q);
        }

        public static DataTable GetDetalleServiciosByPlataforma(string nit, string plataforma)
        {
            var q = from s in DataContext.SERVICIO
                    join c in DataContext.CUENTA on s.ID_CUENTASFDC equals c.ID_CUENTASFDC
                    where c.NIT_CUENTA == nit && s.ESTADO_SERVICIO.Equals("ACTIVO") && s.TECNOLOGIA == plataforma
                    select new
                    {
                        id = s.ID_SERVICIOSDFC,
                        nombre = s.NOMBRE_SERVICIO,
                        cpa = s.NUMERO_CPA,
                        velocidad = s.VELOCIDAD,
                        tecnologia = s.TECNOLOGIA,
                        estado = s.ESTADO_SERVICIO,
                        plataforma = s.TECNOLOGIA,
                        localizacion = s.LOCALIZACION
                    };

            DataTable dt = ConvertData.ToDataTable(q);

            if (dt.Rows.Count == 0)
                return dt;

            //Renombra columnas
            dt.Columns["nombre"].ColumnName = "Nombre Servicio";
            dt.Columns["cpa"].ColumnName = "CPA";
            dt.Columns["velocidad"].ColumnName = "Velocidad";
            dt.Columns["tecnologia"].ColumnName = "Tecnología";
            dt.Columns["estado"].ColumnName = "Estado";
            dt.Columns["plataforma"].ColumnName = "Plataforma";            
            dt.Columns["localizacion"].ColumnName = "Localización";

            return dt;
        }

        /// <summary>
        /// Retorna la cantidad de servicios que están en proceso de activación
        /// </summary>
        /// <param name="nit"></param>
        /// <returns></returns>
        public static int GetSumaServiciosEnProcesoActivacion(string nit, string[] estados)
        {
            var q = from s in DataContext.SERVICIO
                    join c in DataContext.CUENTA on s.ID_CUENTASFDC equals c.ID_CUENTASFDC
                    where c.NIT_CUENTA == nit && estados.Contains(s.ESTADO_SERVICIO)
                    && s.TIPO_FLUJO == "FLUJO INSTALACION"
                    select s;


            return q.Count();                                        
        }        

        /// <summary>
        /// Retorna la cantidad de servicios que están en traslado
        /// </summary>
        /// <param name="nit"></param>
        /// <param name="estados"></param>
        /// <returns></returns>
        public static int GetSumaServiciosEnTraslado(string nit, string[] estados)
        {
            var q = from s in DataContext.SERVICIO
                    join c in DataContext.CUENTA on s.ID_CUENTASFDC equals c.ID_CUENTASFDC
                    where c.NIT_CUENTA == nit 
                    && estados.Contains(s.ESTADO_SERVICIO) && s.TIPO_FLUJO == "FLUJO TRASLADO"
                    select s;


            return q.Count();
        }

        /// <summary>
        /// Retorna la cantidad de servicios que están en cancelación
        /// </summary>
        /// <param name="nit"></param>
        /// <param name="estados"></param>
        /// <returns></returns>
        public static int GetSumaServiciosEnCancelacion(string nit, string[] estados)
        {
            var q = from s in DataContext.SERVICIO
                    join c in DataContext.CUENTA on s.ID_CUENTASFDC equals c.ID_CUENTASFDC
                    where c.NIT_CUENTA == nit && estados.Contains(s.ESTADO_SERVICIO)
                    && s.TIPO_FLUJO == "FLUJO DE CANCELACION"
                    select s;

            return q.Count();
        }

        public static DataTable GetDetalleServiciosSolicitudesEnCurso(string nit, string[] estados, bool traslado, string flujo)
        {
            DataTable dt = new DataTable();

            if (traslado)
            {
                var q = from s in DataContext.SERVICIO
                        join c in DataContext.CUENTA on s.ID_CUENTASFDC equals c.ID_CUENTASFDC
                        where c.NIT_CUENTA == nit && estados.Contains(s.ESTADO_SERVICIO) 
                        && s.TIPO_FLUJO == flujo
                        select new
                        {
                            id = s.ID_SERVICIOSDFC,
                            nombre = s.NOMBRE_SERVICIO,
                            cpa = s.NUMERO_CPA,
                            velocidad = s.VELOCIDAD,
                            tecnologia = s.TECNOLOGIA,
                            estado = s.ESTADO_SERVICIO,
                            plataforma = s.TECNOLOGIA,
                            localizacion = s.LOCALIZACION
                        };

                dt = ConvertData.ToDataTable(q);
            }
            else
            {
                var q = from s in DataContext.SERVICIO
                        join c in DataContext.CUENTA on s.ID_CUENTASFDC equals c.ID_CUENTASFDC
                        where c.NIT_CUENTA == nit && estados.Contains(s.ESTADO_SERVICIO)
                        && s.TIPO_FLUJO == flujo
                        select new
                        {
                            id = s.ID_SERVICIOSDFC,
                            nombre = s.NOMBRE_SERVICIO,
                            cpa = s.NUMERO_CPA,
                            velocidad = s.VELOCIDAD,
                            tecnologia = s.TECNOLOGIA,
                            estado = s.ESTADO_SERVICIO,
                            plataforma = s.TECNOLOGIA,
                            localizacion = s.LOCALIZACION
                        };

                dt = ConvertData.ToDataTable(q);            
            }


            if (dt.Rows.Count == 0)
                return dt;

            //Renombra columnas
            dt.Columns["nombre"].ColumnName = "Nombre Servicio";
            dt.Columns["cpa"].ColumnName = "CPA";
            dt.Columns["velocidad"].ColumnName = "Velocidad";
            dt.Columns["tecnologia"].ColumnName = "Tecnología";
            dt.Columns["estado"].ColumnName = "Estado";
            dt.Columns["plataforma"].ColumnName = "Plataforma";
            dt.Columns["localizacion"].ColumnName = "Localización";

            return dt;
        }

        /// <summary>
        /// Retorna la cantidad de servicios que están en cancelación
        /// </summary>
        /// <param name="nit"></param>
        /// <param name="estados"></param>
        /// <returns></returns>
        public static int GetSumaServiciosDemo(string nit, string[] estados)
        {
            var q = from s in DataContext.SERVICIO
                    join c in DataContext.CUENTA on s.ID_CUENTASFDC equals c.ID_CUENTASFDC
                    where c.NIT_CUENTA == nit && estados.Contains(s.ESTADO_SERVICIO)
                    && s.TIPO_SERVICIO.ToUpper() == "DEMO"
                    select s;

            return q.Count();
        }

        public static DataTable GetDetalleServiciosDemo(string nit, string[] estados)
        {
            var q = from s in DataContext.SERVICIO
                    join c in DataContext.CUENTA on s.ID_CUENTASFDC equals c.ID_CUENTASFDC
                    where c.NIT_CUENTA == nit && estados.Contains(s.ESTADO_SERVICIO)
                    && s.TIPO_SERVICIO.ToUpper() == "DEMO"
                    select new
                    {
                        id = s.ID_SERVICIOSDFC,
                        nombre = s.NOMBRE_SERVICIO,
                        cpa = s.NUMERO_CPA,
                        velocidad = s.VELOCIDAD,
                        tecnologia = s.TECNOLOGIA,
                        estado = s.ESTADO_SERVICIO,
                        plataforma = s.TECNOLOGIA,
                        localizacion = s.LOCALIZACION
                    };

            DataTable dt = ConvertData.ToDataTable(q);

            if (dt.Rows.Count == 0)
                return dt;

            //Renombra columnas
            dt.Columns["nombre"].ColumnName = "Nombre Servicio";
            dt.Columns["cpa"].ColumnName = "CPA";
            dt.Columns["velocidad"].ColumnName = "Velocidad";
            dt.Columns["tecnologia"].ColumnName = "Tecnología";
            dt.Columns["estado"].ColumnName = "Estado";
            dt.Columns["plataforma"].ColumnName = "Plataforma";
            dt.Columns["localizacion"].ColumnName = "Localización";

            return dt;        
        }


        /// <summary>
        /// Retorna datatable con la cantidad de servicios por estado
        /// </summary>
        /// <param name="nit"></param>
        /// <returns></returns>
        public static DataTable GetDetalleServiciosByEstado(string nit, string estado)
        {
            var q = from s in DataContext.SERVICIO
                    join c in DataContext.CUENTA on s.ID_CUENTASFDC equals c.ID_CUENTASFDC
                    where c.NIT_CUENTA == nit && s.ESTADO_SERVICIO.Equals(estado)
                    select new
                    {
                        servicio = s.NOMBRE_SERVICIO,
                        cpa = s.NUMERO_CPA,
                        velocidad = s.VELOCIDAD,
                        tipoServicios = s.TIPO_SERVICIO,
                        tecnologia = s.TECNOLOGIA,
                        estado = s.ESTADO_SERVICIO
                    };

            return ConvertData.ToDataTable(q);
        }

        public static DataTable GetDetalleServiciosActivos(string nit, string[] estados)
        {
            var q = from s in DataContext.SERVICIO
                    join c in DataContext.CUENTA on s.ID_CUENTASFDC equals c.ID_CUENTASFDC
                    where c.NIT_CUENTA == nit && estados.Contains(s.ESTADO_SERVICIO) && s.ORIGEN_ENLACE != "DEMO"
                    select new
                    {
                        id = s.ID_SERVICIOSDFC,
                        nombre = s.NOMBRE_SERVICIO,
                        cpa = s.NUMERO_CPA,
                        velocidad = s.VELOCIDAD,                        
                        tecnologia = s.TECNOLOGIA,
                        estado = s.ESTADO_SERVICIO,
                        fechaActivacion = s.FECHA_ACTIVACION,
                        fechaActivacion2 = "",
                        fechaContrato = s.FECHA_FIRMA_CONTRATO,
                        fechaContrato2 = "",
                        localizacion = s.LOCALIZACION
                    };

            DataTable dt = ConvertData.ToDataTable(q);

            if (dt.Rows.Count == 0)
                return dt;

            //Renombra columnas
            dt.Columns["nombre"].ColumnName = "Nombre Servicio";
            dt.Columns["cpa"].ColumnName = "CPA";
            dt.Columns["velocidad"].ColumnName = "Velocidad";
            dt.Columns["tecnologia"].ColumnName = "Tecnología";            
            dt.Columns["estado"].ColumnName = "Estado";
            dt.Columns["fechaActivacion2"].ColumnName = "Fecha Activación";
            dt.Columns["fechaContrato2"].ColumnName = "Fecha Contrato";
            dt.Columns["localizacion"].ColumnName = "Localización";

            return dt;
        }

        public static DataTable GetDetalleServiciosSuspendidos(string nit, string[] estados)
        {
            var q = from s in DataContext.SERVICIO
                    join c in DataContext.CUENTA on s.ID_CUENTASFDC equals c.ID_CUENTASFDC
                    where c.NIT_CUENTA == nit && estados.Contains(s.ESTADO_SERVICIO) && s.ORIGEN_ENLACE != "DEMO"
                    select new
                    {
                        id = s.ID_SERVICIOSDFC,
                        nombre = s.NOMBRE_SERVICIO,
                        cpa = s.NUMERO_CPA,
                        velocidad = s.VELOCIDAD,
                        tecnologia = s.TECNOLOGIA,
                        estado = s.ESTADO_SERVICIO,
                        fechaContrato = s.FECHA_FIRMA_CONTRATO,
                        fechaContrato2 = "",
                        fechaSuspension = s.FECHA_SUSPENSION,
                        fechaSuspension2 = "",  
                        fechaReactivacion = s.FECHA_SUSPENSION,
                        fechaReactivacion2 = "",
                        motivoSuspension = s.MOTIVO_SUSPENSION,
                        localizacion = s.LOCALIZACION
                    };

            
            DataTable dt = ConvertData.ToDataTable(q);            

            if (dt.Rows.Count == 0)
                return dt;

            for (int i = 0; i < dt.Rows.Count; i++)
            {
                if (dt.Rows[i]["fechaReactivacion"].ToString() != "")
                    dt.Rows[i]["fechaReactivacion"] = Convert.ToDateTime(dt.Rows[i]["fechaReactivacion"].ToString()).AddMonths(2);
            }

            //Renombra columnas
            dt.Columns["nombre"].ColumnName = "Nombre Servicio";
            dt.Columns["cpa"].ColumnName = "CPA";
            dt.Columns["velocidad"].ColumnName = "Velocidad";
            dt.Columns["tecnologia"].ColumnName = "Tecnología";
            dt.Columns["estado"].ColumnName = "Estado";            
            dt.Columns["fechaContrato2"].ColumnName = "Fecha Contrato";
            dt.Columns["fechaSuspension2"].ColumnName = "Fecha Suspensión";
            dt.Columns["fechaReactivacion2"].ColumnName = "Fecha Reactivación";
            dt.Columns["motivoSuspension"].ColumnName = "Motivo Suspensión";
            dt.Columns["localizacion"].ColumnName = "Localización";

            return dt;
        }

        public static DataTable GetDetalleServiciosCancelaciones(string nit, string[] estados)
        {
            var q = from s in DataContext.SERVICIO
                    join c in DataContext.CUENTA on s.ID_CUENTASFDC equals c.ID_CUENTASFDC
                    where c.NIT_CUENTA == nit && estados.Contains(s.ESTADO_SERVICIO) && s.ORIGEN_ENLACE != "DEMO"
                    select new
                    {
                        id = s.ID_SERVICIOSDFC,
                        nombre = s.NOMBRE_SERVICIO,
                        cpa = s.NUMERO_CPA,
                        velocidad = s.VELOCIDAD,
                        tecnologia = s.TECNOLOGIA,
                        estado = s.ESTADO_SERVICIO,
                        fechaCancelacion = s.FECHA_CANCELACION,
                        fechaCancelacion2 = "",
                        motivoCancelacion = s.MOTIVO_CANCELACION,
                        localizacion = s.LOCALIZACION
                    };

            DataTable dt = ConvertData.ToDataTable(q);

            if (dt.Rows.Count == 0)
                return dt;

            //Renombra columnas
            dt.Columns["nombre"].ColumnName = "Nombre Servicio";
            dt.Columns["cpa"].ColumnName = "CPA";
            dt.Columns["velocidad"].ColumnName = "Velocidad";
            dt.Columns["tecnologia"].ColumnName = "Tecnología";
            dt.Columns["estado"].ColumnName = "Estado";
            dt.Columns["fechaCancelacion2"].ColumnName = "Fecha Cancelación";            
            dt.Columns["motivoCancelacion"].ColumnName = "Motivo Cancelación";
            dt.Columns["localizacion"].ColumnName = "Localización";

            return dt;
        }

        public static DataTable GetReporteVentas(string nit, DateTime fecha1, DateTime fecha2, string[] estados)
        {
            var q = from s in DataContext.SERVICIO
                    join c in DataContext.CUENTA on s.ID_CUENTASFDC equals c.ID_CUENTASFDC
                    where c.NIT_CUENTA == nit 
                    && s.FECHA_FIRMA_CONTRATO >= fecha1 && s.FECHA_FIRMA_CONTRATO <= fecha2
                    select new
                    {
                        id = s.ID_SERVICIOSDFC,
                        nombre = s.NOMBRE_SERVICIO,
                        cpa = s.NUMERO_CPA,
                        velocidad = s.VELOCIDAD,
                        tecnologia = s.TECNOLOGIA,
                        estado = s.ESTADO_SERVICIO,
                        fechaActivacion = s.FECHA_ACTIVACION,
                        fechaActivacion2 = "",
                        fechaContrato = s.FECHA_FIRMA_CONTRATO,
                        fechaContrato2 = "",
                        localizacion = s.LOCALIZACION
                    };

            DataTable dt = ConvertData.ToDataTable(q);

            if (dt.Rows.Count == 0)
                return dt;

            //Renombra columnas
            dt.Columns["nombre"].ColumnName = "Nombre Servicio";
            dt.Columns["cpa"].ColumnName = "CPA";
            dt.Columns["velocidad"].ColumnName = "Velocidad";
            dt.Columns["tecnologia"].ColumnName = "Tecnología";
            dt.Columns["estado"].ColumnName = "Estado";
            dt.Columns["fechaActivacion2"].ColumnName = "Fecha Activación";
            dt.Columns["fechaContrato2"].ColumnName = "Fecha Contrato";
            dt.Columns["localizacion"].ColumnName = "Localización";

            return dt;

        }

        public static DataTable GetReporteActivaciones(string nit, DateTime fecha1, DateTime fecha2, string[] estados)
        {
            var q = from s in DataContext.SERVICIO
                    join c in DataContext.CUENTA on s.ID_CUENTASFDC equals c.ID_CUENTASFDC
                    where c.NIT_CUENTA == nit && estados.Contains(s.ESTADO_SERVICIO)
                    && s.FECHA_ACTIVACION >= fecha1 && s.FECHA_ACTIVACION <= fecha2
                    select new
                    {
                        id = s.ID_SERVICIOSDFC,
                        nombre = s.NOMBRE_SERVICIO,
                        cpa = s.NUMERO_CPA,
                        velocidad = s.VELOCIDAD,
                        tecnologia = s.TECNOLOGIA,
                        estado = s.ESTADO_SERVICIO,
                        fechaActivacion = s.FECHA_ACTIVACION,
                        fechaActivacion2 = "",
                        fechaContrato = s.FECHA_FIRMA_CONTRATO,
                        fechaContrato2 = "",
                        localizacion = s.LOCALIZACION
                    };

            DataTable dt = ConvertData.ToDataTable(q);

            if (dt.Rows.Count == 0)
                return dt;

            //Renombra columnas
            dt.Columns["nombre"].ColumnName = "Nombre Servicio";
            dt.Columns["cpa"].ColumnName = "CPA";
            dt.Columns["velocidad"].ColumnName = "Velocidad";
            dt.Columns["tecnologia"].ColumnName = "Tecnología";
            dt.Columns["estado"].ColumnName = "Estado";
            dt.Columns["fechaActivacion2"].ColumnName = "Fecha Activación";
            dt.Columns["fechaContrato2"].ColumnName = "Fecha Contrato";
            dt.Columns["localizacion"].ColumnName = "Localización";

            return dt;

        }

        public static DataTable GetReporteCancelaciones(string nit, DateTime fecha1, DateTime fecha2, string[] estados)
        {
            var q = from s in DataContext.SERVICIO
                    join c in DataContext.CUENTA on s.ID_CUENTASFDC equals c.ID_CUENTASFDC
                    where c.NIT_CUENTA == nit && estados.Contains(s.ESTADO_SERVICIO)
                    && s.FECHA_CANCELACION >= fecha1 && s.FECHA_CANCELACION <= fecha2
                    select new
                    {
                        id = s.ID_SERVICIOSDFC,
                        nombre = s.NOMBRE_SERVICIO,
                        cpa = s.NUMERO_CPA,
                        velocidad = s.VELOCIDAD,
                        tecnologia = s.TECNOLOGIA,
                        estado = s.ESTADO_SERVICIO,
                        fechaActivacion = s.FECHA_ACTIVACION,
                        fechaActivacion2 = "",
                        fechaContrato = s.FECHA_FIRMA_CONTRATO,
                        fechaContrato2 = "",
                        localizacion = s.LOCALIZACION
                    };

            DataTable dt = ConvertData.ToDataTable(q);

            if (dt.Rows.Count == 0)
                return dt;

            //Renombra columnas
            dt.Columns["nombre"].ColumnName = "Nombre Servicio";
            dt.Columns["cpa"].ColumnName = "CPA";
            dt.Columns["velocidad"].ColumnName = "Velocidad";
            dt.Columns["tecnologia"].ColumnName = "Tecnología";
            dt.Columns["estado"].ColumnName = "Estado";
            dt.Columns["fechaActivacion2"].ColumnName = "Fecha Activación";
            dt.Columns["fechaContrato2"].ColumnName = "Fecha Contrato";
            dt.Columns["localizacion"].ColumnName = "Localización";

            return dt;
        }

        public static DataTable GetReporteUpgrade(string nit, DateTime fecha1, DateTime fecha2, string[] estados)
        {
            var q = from s in DataContext.SERVICIO
                    join c in DataContext.CUENTA on s.ID_CUENTASFDC equals c.ID_CUENTASFDC
                    where c.NIT_CUENTA == nit && estados.Contains(s.ESTADO_SERVICIO)
                    && s.FECHA_ACTIVACION_UPGRADE >= fecha1 && s.FECHA_ACTIVACION_UPGRADE <= fecha2
                    && s.ANTIGUO_ARTIUCLO.Length > 0
                    select new
                    {
                        id = s.ID_SERVICIOSDFC,
                        nombre = s.NOMBRE_SERVICIO,
                        cpa = s.NUMERO_CPA,
                        velocidad = s.VELOCIDAD,
                        tecnologia = s.TECNOLOGIA,
                        estado = s.ESTADO_SERVICIO,
                        fechaActivacion = s.FECHA_ACTIVACION,
                        fechaActivacion2 = "",
                        fechaContrato = s.FECHA_FIRMA_CONTRATO,
                        fechaContrato2 = "",
                        localizacion = s.LOCALIZACION
                    };

            DataTable dt = ConvertData.ToDataTable(q);

            if (dt.Rows.Count == 0)
                return dt;

            //Renombra columnas
            dt.Columns["nombre"].ColumnName = "Nombre Servicio";
            dt.Columns["cpa"].ColumnName = "CPA";
            dt.Columns["velocidad"].ColumnName = "Velocidad";
            dt.Columns["tecnologia"].ColumnName = "Tecnología";
            dt.Columns["estado"].ColumnName = "Estado";
            dt.Columns["fechaActivacion2"].ColumnName = "Fecha Activación";
            dt.Columns["fechaContrato2"].ColumnName = "Fecha Contrato";
            dt.Columns["localizacion"].ColumnName = "Localización";

            return dt;

        }


        #endregion

        /// <summary>
        /// Retorna el tipo de cliente dado un nit
        /// </summary>
        public static string GetTipoCliente(string nit)
        {
            CUENTA cta = AccountController.GetCuentaByNit(nit);
            if (cta == null)
                return "";
            else
                return cta.TIPO_CLIENTE;

        }

        /// <summary>
        /// Retorna enumercion TipoCliente dado un string de tipo de cliente
        /// </summary>
        /// <param name="tipo"></param>
        /// <returns></returns>
        public static TipoCliente GetTipoClienteFromString(string tipo)
        { 
            if (tipo.Equals("Clientes corporativos y alianzas"))
                return TipoCliente.CORPORATIVOS;
            else if (tipo.Equals("Clientes residenciales"))
                return TipoCliente.FINALES;
            else if (tipo.Equals("Clientes Directos"))
                return TipoCliente.FINALES;
            else if (tipo.Equals("Clientes Internacionales"))
                return TipoCliente.INTERNACIONALES;        
            else
                return TipoCliente.CORPORATIVOS;
        }

    }
}